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