Qt的四個常見的圖像疊加模式

Qt的QPainter::CompositionMode提供了多種圖像疊加的模式。常見的有QPainter::CompositionMode_SourceOver, QPainter::CompositionMode_SourceAtop,git

QPainter::CompositionMode_DestinationOver和QPainter::CompositionMode_DestinationAtop。如今逐個描述這四種模式的效果。函數

 

從http://www.tuicool.com/articles/NF3qIb下載了兩幅尺寸相等圖片:ui

 

如今用第一幅圖片作掩蓋,與第二幅圖片合成this

 

1)QPainter::CompositionMode_DestinationOverspa

 

 

[cpp]  view plain  copy
 
  1. #include "mainwindow.h"  
  2. #include <QMessageBox>  
  3. #include <QFileDialog>  
  4. #include <QPainter>  
  5. #include <QPaintEvent>  
  6.   
  7.   
  8. MainWindow::MainWindow(QWidget *parent)  
  9.     : QMainWindow(parent)  
  10. {  
  11.     QString filename;  
  12.     filename=QFileDialog::getOpenFileName(this,  
  13.                                               tr("選擇圖像"),  
  14.                                               "",  
  15.                                               tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));  
  16.         if(filename.isEmpty())  
  17.         {  
  18.              return;  
  19.         }  
  20.         else  
  21.         {  
  22.             if(! ( m_img.load(filename) ) ) //加載圖像  
  23.             {  
  24.                 QMessageBox::information(this,  
  25.                                          tr("打開圖像失敗"),  
  26.                                          tr("打開圖像失敗!"));  
  27.   
  28.                 return;  
  29.             }  
  30.             m_img.load(filename);  
  31.         }  
  32.   
  33.   
  34.     filename=QFileDialog::getOpenFileName(this,  
  35.                                           tr("選擇mask"),  
  36.                                           "",  
  37.                                           tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));  
  38.             if(filename.isEmpty())  
  39.             {  
  40.                  return;  
  41.             }  
  42.             else  
  43.             {  
  44.                 if(! ( m_mask.load(filename) ) ) //加載圖像  
  45.                 {  
  46.                     QMessageBox::information(this,  
  47.                                              tr("打開圖像失敗"),  
  48.                                              tr("打開圖像失敗!"));  
  49.   
  50.                     return;  
  51.                 }  
  52.                 m_mask.load(filename);  
  53.             }  
  54. }  
  55.   
  56. MainWindow::~MainWindow()  
  57. {  
  58.   
  59. }  
  60.   
  61. void MainWindow::paintEvent(QPaintEvent *e)  
  62. {  
  63.     QImage * newImage = new QImage(m_img);  
  64.       
  65.     QImage * mask = new QImage(m_mask);  
  66.     QPainter painter;  
  67.   
  68.     painter.begin(mask);  
  69.   
  70.     painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);  
  71.     painter.drawImage(0, 0, * newImage);  
  72.   
  73.     painter.end();  
  74.   
  75.     painter.begin(this);  
  76.     painter.drawImage(e->rect(), * mask);  
  77.     painter.end();  
  78.   
  79.     delete mask;  
  80.     delete newImage;  
  81. }  


注: m_mask和m_img都是QImage類型的變量,也是MainWindow類的成員。一個表明掩蓋圖,一個表明花瓶圖。運行程序時,MainWindow的構造函數會先詢問哪個文件是被遮擋的花瓶圖。你選定以後,MainWindow會再次詢問哪個是掩蓋圖。選定以後,程序自動調用paintEvent,把兩個圖合成。.net

 

 

效果:code

 

2)CompositionMode_DestinationAtoporm

將painter.setCompositionMode(QPainter::CompositionMode_DestinationOver)一句改成painter.setCompositionMode(QPainter::CompositionMode_DestinationAtop)便可。blog

效果和1)相同。圖片

3)CompositionMode_SourceAtop

 
 

將painter.setCompositionMode(QPainter::CompositionMode_DestinationOver)一句改成painter.setCompositionMode(QPainter::CompositionMode_SourceAtop)便可。

效果:

 

4)CompositionMode_SourceOver。遮蓋不起做用。

相關文章
相關標籤/搜索