Qt的四个常见的图像叠加模式

来源:互联网 发布:远程网络教育的优势 编辑:程序博客网 时间:2024/06/17 14:00

Qt的QPainter::CompositionMode提供了多种图像叠加的模式。常见的有QPainter::CompositionMode_SourceOver, QPainter::CompositionMode_SourceAtop,

QPainter::CompositionMode_DestinationOver和QPainter::CompositionMode_DestinationAtop。现在逐个描述这四种模式的效果。


从http://www.tuicool.com/articles/NF3qIb下载了两幅尺寸相等图片:




现在用第一幅图片做掩盖,与第二幅图片合成


1)QPainter::CompositionMode_DestinationOver

#include "mainwindow.h"#include <QMessageBox>#include <QFileDialog>#include <QPainter>#include <QPaintEvent>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    QString filename;    filename=QFileDialog::getOpenFileName(this,                                              tr("选择图像"),                                              "",                                              tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));        if(filename.isEmpty())        {             return;        }        else        {            if(! ( m_img.load(filename) ) ) //加载图像            {                QMessageBox::information(this,                                         tr("打开图像失败"),                                         tr("打开图像失败!"));                return;            }            m_img.load(filename);        }    filename=QFileDialog::getOpenFileName(this,                                          tr("选择mask"),                                          "",                                          tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));            if(filename.isEmpty())            {                 return;            }            else            {                if(! ( m_mask.load(filename) ) ) //加载图像                {                    QMessageBox::information(this,                                             tr("打开图像失败"),                                             tr("打开图像失败!"));                    return;                }                m_mask.load(filename);            }}MainWindow::~MainWindow(){}void MainWindow::paintEvent(QPaintEvent *e){    QImage * newImage = new QImage(m_img);        QImage * mask = new QImage(m_mask);    QPainter painter;    painter.begin(mask);    painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);    painter.drawImage(0, 0, * newImage);    painter.end();    painter.begin(this);    painter.drawImage(e->rect(), * mask);    painter.end();    delete mask;    delete newImage;}

注: m_mask和m_img都是QImage类型的变量,也是MainWindow类的成员。一个代表掩盖图,一个代表花瓶图。运行程序时,MainWindow的构造函数会先询问哪一个文件是被遮挡的花瓶图。你选定之后,MainWindow会再次询问哪一个是掩盖图。选定之后,程序自动调用paintEvent,把两个图合成。


效果:



2)CompositionMode_DestinationAtop

将painter.setCompositionMode(QPainter::CompositionMode_DestinationOver)一句改为painter.setCompositionMode(QPainter::CompositionMode_DestinationAtop)即可。

效果和1)相同。

3)CompositionMode_SourceAtop

将painter.setCompositionMode(QPainter::CompositionMode_DestinationOver)一句改为painter.setCompositionMode(QPainter::CompositionMode_SourceAtop)即可。

效果:


4)CompositionMode_SourceOver。遮盖不起作用。


0 0
原创粉丝点击