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

 

posted @   手磨咖啡  阅读(1778)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示