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