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

  • 相关阅读:
    最近遇到的若干Web前端问题:disable和readonly,JqueryEasyUI,KindEditor
    最近遇到的若干Web前端问题:disable和readonly,JqueryEasyUI,KindEditor
    2015年工作中遇到的问题111-120
    2015年工作中遇到的问题111-120
    POJ 1459 Power Network
    POJ 2135 Farm Tour
    HDU 3062 Party
    学渣乱搞系列之网络流学习
    POJ 1094 Sorting It All Out
    HDU 1704 Rank
  • 原文地址:https://www.cnblogs.com/zzzsj/p/15926407.html
Copyright © 2020-2023  润新知