Qt Examples之imagecomposition工程分析

从Photoshop图层混合到Qt绘图:图解QPainter::CompositionMode的12种核心模式 本文深入解析Qt框架中的QPainter::CompositionMode,对比Photoshop的12种核心图层混合模式,提供从基础到高级的实战应用指南。通过代码示例和视觉对比,详细讲解SourceOver、Multiply等模式的实现原理及适用场景,帮助开发者高效实现图形混合效果,提升UI设计质量。 阅读详情

imagecomposition工程存放在Qt安装目录下的
Examples\Qt-x.xx.xx\widgets\painting\imagecomposition
目录下。其中
x.xx.xx为Qt的版本号。该工程展示了QPainter::CompositionMode的含义。要弄懂本工程请先参考《QPainter类的CompositionMode各值含义》
,否则本工程对初学者很难弄懂。

预备知识:

把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。初次画的时候,窗体上什么都没有,则窗体或窗体的一个区域(当运用裁剪时)为目标,即将要画上去的图形为源。

弄懂本工程的关键是要搞懂QPainter类的CompositionMode各值含义、源图像和目标图像的概念。

loadImage函数分析

该工程的loadImage函数代码如下:

void ImageComposer::loadImage(const QString &fileName, QImage *image,
                              QToolButton *button)
{
    image->load(fileName);

    // Scale the image to given size
    *image = image->scaled(resultSize, Qt::KeepAspectRatio);
    QImage fixedImage(resultSize, QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&fixedImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(fixedImage.rect(), Qt::transparent);
   painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(imagePos(*image), *image);
    painter.end();
    button->setIcon(QPixmap::fromImage(fixedImage));

    *image = fixedImage;

    recalculateResult();
}

当代码执行到第11行但11行后的代码没执行时,即将第12、13、19行代码注释掉,根据前面源和目标的定义可以知道:此时窗体为目标,fixedImage为源,根据《QPainter类的CompositionMode各值含义》文章对QPainter::CompositionMode_Source的描述,可以知道,此时只显示源,但因为fixedImage设置为透明的,所以即使显示的是源,但看到的是源后面的窗体,如下:
在这里插入图片描述
如果将第11行改为:

painter.fillRect(fixedImage.rect(), Qt::red);

则输出如下:
在这里插入图片描述
因为源是红色的,不再透明,所以看不到后面的窗体,显示的是源的红色。将第11行依然设置为红色,取消12、13行注释,则此时11行绘制上去的红色QImage对象fixedImage为目标,第13行绘制的image对象为源,因为绘图组合模式是QPainter::CompositionMode_SourceOver,根据《QPainter类的CompositionMode各值含义》文章对QPainter::CompositionMode_SourceOver的描述,可以知道此时目标和源重叠的部分进行混合,且源盖住(遮挡住)目标,没有重叠部分各自保留即都绘制出来,结果如下:
在这里插入图片描述将第11行依然设置为Qt::transparent,则如下:
在这里插入图片描述
在ImageComposer类的构造函数中,通过本函数分别加载了两张图形,一张用于最左侧QToolButton按钮贴图,一张用于中间QToolButton按钮贴图。

recalculateResult函数分析

函数代码如下:

void ImageComposer::recalculateResult()
{
    QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, destinationImage);
    painter.setCompositionMode(mode);
    painter.drawImage(0, 0, sourceImage);
    painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
    painter.fillRect(resultImage.rect(), Qt::white);
    painter.end();

    resultLabel->setPixmap(QPixmap::fromImage(resultImage));
}

代码执行到第7行时,即代码如下:

void ImageComposer::recalculateResult()
{
    QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
   /* painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, destinationImage);
    painter.setCompositionMode(mode);
    painter.drawImage(0, 0, sourceImage);
    painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
    painter.fillRect(resultImage.rect(), Qt::white);*/
    painter.end();

    resultLabel->setPixmap(QPixmap::fromImage(resultImage));
}

目标是QLabel类型的resultLabel子窗体部件,源是透明的QImage类对象resultImage,采用CompositionMode_Source模式绘制,结果就是将resultImage贴在resultLabel子窗体部件上面,因为resultImage是透明的,所以至第7行时,resultImage绘制和没绘制都一样,你看到的都是resultLabel子窗体部件。代码执行到第8、9行时,即代码如下:

void ImageComposer::recalculateResult()
{
    QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, destinationImage);
   /*  painter.setCompositionMode(mode);
    painter.drawImage(0, 0, sourceImage);
    painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
    painter.fillRect(resultImage.rect(), Qt::white);*/
    painter.end();

    resultLabel->setPixmap(QPixmap::fromImage(resultImage));
}

设置QPainter::CompositionMode_SourceOver模式后再以resultImage为画布(绘图设备)绘制了destinationImage,此时destinationImage为源,resultImage为目标。根据《QPainter类的CompositionMode各值含义》文章对QPainter::CompositionMode_SourceOver的描述,可以知道此时目标和源重叠的部分进行混合,且源盖住(遮挡住)目标,没有重叠部分各自保留即都绘制出来,结果如下红色方框所示:
在这里插入图片描述
代码执行到第10、11行时,即代码如下:

void ImageComposer::recalculateResult()
{
    QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, destinationImage);
     painter.setCompositionMode(mode);
    painter.drawImage(0, 0, sourceImage);
   /* painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
    painter.fillRect(resultImage.rect(), Qt::white);*/
    painter.end();

    resultLabel->setPixmap(QPixmap::fromImage(resultImage));
}

根据界面的选择来设置相应的组合模式,并绘制sourceImage,此时第10行之前绘制的结果即destinationImage为目标,即将要绘制的sourceImage为源,如下红色方框为在界面下拉框选择组合模式为SourceOver的输出:
在这里插入图片描述
代码执行到13行,即代码如下时:

void ImageComposer::recalculateResult()
{
    QPainter::CompositionMode mode = currentMode();

    QPainter painter(&resultImage);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawImage(0, 0, destinationImage);
     painter.setCompositionMode(mode);
    painter.drawImage(0, 0, sourceImage);
    painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
    painter.fillRect(resultImage.rect(), Qt::white);
    painter.end();

    resultLabel->setPixmap(QPixmap::fromImage(resultImage));
}

此时resultImage为源,之前绘制的为目标,又因为第12行设置模式为QPainter::CompositionMode_DestinationOver,即源图像如果和目标图像有重叠,绘制时,则重叠部分是目标图像在源图像上面(目标遮挡住源),当目标的alpha为255时,源被目标完全遮挡。重叠部分的源和重叠部分的目标进行混合,混合之后得出的RGBA值为重叠部分的RGBA值,没有重叠部分各自保留即都绘制出来。所以最终的输出结果如下:
在这里插入图片描述
可以结合《QPainter类的CompositionMode各值含义》文章对各个组合模式的描述,读者自行选择界面下拉框上的不同的模式进行体会、理解。

Qt QPainter CompositionMode解读及图片透明度设置 文章目录前言研究相关QPainter::CompositionModeQPainter::CompositionMode_SourceOverQPainter::CompositionMode_SourceQPainter::CompositionMode_DestinationIn调节图片透明度写在最后 前言 Qt的QPainter十分强大,设置不同的组合模式,可以得到迥然不同的结果,比如调节图... 阅读详情

相关推荐

qt里的图片合成

使用qt的枚举类QPainter::CompositionMode,进行两幅图片的叠加。

QPainter类的CompositionMode各值含义

QPainter::CompositionMode用法讲解

danshiming的博客 8595

同花顺客户端数据采集:Hook注入与内存解密实战

在金融量化领域,客户端数据采集是获取低延迟、高精度行情的关键技术路径。其底层涉及进程通信、内存加密、反调试等典型Windows逆向工程问题。理解API Hook原理与AES-CBC动态密钥派生机制,有助于突破传统HTTP爬虫在国产金融软件中的失效困境。该技术不依赖网络劫持,而聚焦于本地进程内函数拦截与运行时内存解析,具备离线、可控、合规等工程优势,广泛应用于Level2行情、逐笔委托、分笔成交等高频数据场景,是量化基础设施中‘端侧数据主权’的重要实现方式。

weixin_30496999的博客 856

QT图片叠加CompositionMode效果一览

QPixmap tmpPix(pix.size()); tmpPix.fill(Qt::transparent); QPainter p1(&tmpPix); p1.setCompositionMode(QPainter::CompositionMode_Source); p1.drawPixmap(0, 0, pix); if (canBuild)//可建则用半透明表示 { //20...

chduguxue的专栏 7215

Cadence Allegro通过手工绘制板框的方法

Cadence Allegro通过手工绘制板框的方法 Cadence Allegro绘制板框有三个方法: 1、通过手工绘制板框; 2、通过向导绘制板框; 3、通过导入DXF文件导绘制板框; 本章将教会大家如何通过手工的方法绘制100mm的矩形板框。 方法步骤如下: 一、通过放置绘图工具2D线绘制; 1、运行Cadence Allegro软件,打开File菜单栏,选择New。 2、这时软件会弹出Ne...

LGCPCB的博客 2万+

【强化学习】11 —— Double DQN算法与Dueling DQN算法

可以看到由于数据点的分布,使得拟合出的价值函数无法与真实的价值函数吻合,甚至在部分区域产生了明显的偏差。Dueling DQN 是 DQN 另一种的改进算法,它在传统 DQN 的基础上只进行了微小的改动,但却能大幅提升 DQN 的表现。这样,即使其中一套神经网络的某个动作存在比较严重的过高估计问题,由于另一套神经网络的存在,这个动作最终使用的值不会存在很大的过高估计问题。.在同一个状态下,所有动作的优势值之和为 0,因为所有动作的动作价值的期望就是这个状态的状态价值。环境的状态包括倒立摆角度的正弦值。

sinat_52032317的博客 1万+

QImage, QPainter复合模式绘图 图片叠加模式 setCompositionMode

Qt的QPainter::CompositionMode提供了多种图像叠加的模式。常见的有QPainter::CompositionMode_SourceOver, QPainter::CompositionMode_SourceAtop, QPainter::CompositionMode_DestinationOver和QPainter::CompositionMode_Destination...

SmallBottle-CGWLMX的博客 7234

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用

本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。

weixin_42522964的博客 334

Qt:玩转QPainter序列三(合成模式)

填充图像为黑色,同时在支持 Alpha 通道的图像格式下,该黑色会被设置为完全透明的黑色。: 填充图像为完全透明,通常用于清除图像内容。

m0_71489826的博客 2020

STM32F411CEU6实战:用W25Q64存储多张图片,在240x240 LCD上轮播显示(附源码)

本文详细介绍了如何使用STM32F411CEU6通过SPI接口管理W25Q64 Flash中的多张图片,并在240x240 LCD上实现平滑轮播显示。内容涵盖硬件配置、图片存储方案设计、轮播系统实现及性能优化技巧,特别针对SPI传输优化和多图存储管理提供了实用解决方案。附源码,适合嵌入式开发者参考。

weixin_32025789的博客 308

[Python图像处理] 一.图像处理基础知识及OpenCV入门函数

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分割窗...

杨秀璋的专栏 7万+

Qt QPainter CompositionMode

Qt QPainter的CompositionMode的应用、给图片添加遮罩

liberty1997的博客 1508

2011-2024年间各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2、指标:数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。中国各省的数字普惠金融指数数据,从数字金融覆盖广度、数字金融使用深度和普惠金融数字化程度3个维度来构建数字普惠金融指标体系。数字普惠金融指数一共3个维度、33项具体指标。全套指数包含数字金融覆盖广度指数、数字金融使用深度指数和普惠金融数字化程度指数,以及数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。

【优快云】 1万+

Qt 技术探索之一:Qt 官方 demo 之 Image Composition Example(图片合成)

Qt 图片合成例子 源码下载 本文取材自 Qt4.5 的官网 Qt Examples -> Painting -> Image Composition。本 demo 主要演示了在 Qt 中是如何选用合成模型将不同的图片合成在一起的。通过本 demo ,我们可以掌握 Qt 中拼接图片、合成图片、组合图片、制造图片以及给图片换背景等实际开发中需要的图片处理技术。 在学习本 demo 之前

@奮 鬥@的专栏 2345

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

weixin_42412049的博客 2278

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QPainter::CompositionMode解析

本文详细介绍了图像处理中的像素合成模式,分为三大类: Porter-Duff合成模式(12种)、Photoshop混合模式(12种)、位运算混合模式(16种)

友善啊,朋友的博客 1423

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

qt中常见的图片叠加模式

Qt的QPainter::CompositionMode提供了多种图像叠加的模式。常见的有QPainter::CompositionMode_SourceOver, QPainter::CompositionMode_SourceAtop,QPainter::CompositionMode_DestinationOver和QPainter::CompositionMode_DestinationA...

全栈工程师 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ControlCom-Image-Composition

其他方法能够生成相同种类的物体,但是在细节保留上效果较差,比如衣服的款式、杯子的纹理、鸟的羽毛颜色等等。右边一列,前景物体的光照原本就和背景光照一致,之前的方法可能会对前景物体的颜色产生不符合预期的改变,比如车的颜色和衣服的颜色,我们方法的 (0,1) 版本能够保留前景物体的颜色,同时调整前景物体的姿态使其合理地融入背景图片。在并行框架下,现在流行的做法是利用扩散模型,输入一张带有前景边界框的背景图片和一张前景物体图片,直接生成最终的合成图,使得前景物体无缝融入背景图片,光照和阴影合理,姿态与背景适配。

whaosoft143ai的博客 594

【cmake】Qt的qrc文件通过cmake在VS中编译Q_INIT_RESOURCE imagecomposition 编译

想把Qt的安装文件里的example编译到VS下运行,想法是通过cmake文件写cmakelist文件进行编译,后来碰到,Q_INIT_RESOURCE一直不能编译通过,提示不能连接,后来各种找,原来在cmake3.0之后,已经可以直接使用了。

qq_43331089的博客 734

Qt实现图像自适应窗口大小之scaled()函数使用

很多应用都需要显示图片,比如视频类应用、拍照类应用,但是在大数情况下用户都会改变窗口大小,以获得最佳效果,在Qt中如果只设置了显示图片而没有对自适应窗口做出设置,用户拖拽边框的时候,整个控件上就会出现大片空白部分,怎么解决这个问题呢? QImage、QPixmap等绘图设备类都提供scaled()函数,下面是Qt文档对于scaled()函数介绍: 函数原型: QImage QIm

imxiangzi的专栏 1万+

使用预先训练的扩散模型进行图像合成

更具体地说,给定图像的一般描述(例如,封面图像中的客厅),我们希望通过文本提示指定的一系列元素出现在特定位置(例如,中心的红色沙发,左边是室内植物,右上角是一幅画)。论文中提出的方法更通用,并且允许其他应用,例如生成全景图像,但我将在这里限制为使用基于区域的文本提示的图像合成的情况。与每个提示关联的区域是通过与图像尺寸相同的二进制掩码指定的。这通常由神经网络完成,该神经网络在每个步骤 t 预测步骤 t-1 的噪声图像,该图像不仅以步骤 t 的噪声图像为条件,而且还以描述其尝试重建的图像的文本提示为条件。

冷冻工厂 458

图形缩放

图形缩放 在PIL库中可以实现图形的缩放,但是 如果使用下面的写法的话,会造成部分的信息丢失 img = img.resize((width, height)) 但是,在PIL中带ANTIALIAS滤镜缩放结果,程序如下: img = img.resize((width, height), Image.ANTIALIAS) 这样的话就不会有信息丢失啦 创建绘...

weixin_43659035的博客 641

速读:ControlCom: Controllable Image Composition using Diffusion Model

本文介绍了一种名为ControlCom的图像合成方法,该方法利用扩散模型进行图像融合、图像调和、视点合成和生成式合成等四个任务,并通过自监督训练框架和专门的数据准备管道进行了设计。此外,为了提高前景细节的保真度,作者还提出了局部增强模块。实验结果表明,该方法比现有方法能够生成更真实可控的复合图像。该文章提出了一种新的图像合成方法ControlCom,通过引入一个二维指示向量来控制图像合成过程中的属性调整,从而实现了可控的图像合成,并且在保持高保真度的同时提高了合成结果的质量。

u012854516的专栏 1415

QPainter类学习

<br />详细描述:<br />QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作。它可以画从简单的线到复杂的形状。通常情况下,QPainter的使用是在widget当中的painter事件使用。记得在执行完之后要及时销毁QPainter的对象。<br />void SimpleExampleWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::blue);

williamslv的专栏 1万+
上一篇: Qt定时器QBasicTimer、startTimer、QTimer使用总结
下一篇: QPainter类的CompositionMode各值含义
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值