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。遮盖不起作用。