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

 

 

[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,把兩個圖合成。

 

 

效果:

 

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