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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM