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   
  3. #include   
  4. #include   
  5. #include   
  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。遮盖不起作用。

你可能感兴趣的:(Qt的四个常见的图像叠加模式)