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

  • 相关阅读:
    Colidity-- NumberOfDiscIntersections
    Colidity--Triangle
    Colidity--CountDiv
    Colidity--MinAvgTwoSlice
    Colidity--GenomicRangeQuery
    Colidity--PassingCars
    操作系统--内存管理方式
    蓝桥杯练习系统—算法训练 P1102
    蓝桥杯练习系统—基础练习 完美的代价
    2n皇后问题
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/8178208.html
Copyright © 2020-2023  润新知