Qt的四个常见的图像叠加模式
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。遮盖不起作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!