Qt:玩转QPainter序列三

news2024/9/20 9:35:18

前言

接着序列三,图像的合成模式。
图像的合成模式(CompositionMode)是在讲述当多个图像重叠时重叠部分该如何显示的问题。

正文

先看合成模式的定义,下面是分析。
在这里插入图片描述

1. enum CompositionMode

  • 这个枚举类型CompositionMode定义了多种图像合成模式。图像合成模式用于控制QPainter在绘制时如何将源图像与目标图像进行组合。不同的合成模式会影响图像的叠加方式、颜色混合效果等。
主要合成模式:
  • CompositionMode_SourceOver: 默认模式,源图像覆盖在目标图像上,考虑透明度。
  • CompositionMode_DestinationOver: 目标图像覆盖在源图像上,考虑透明度。
  • CompositionMode_Clear: 清除目标图像区域,设置为完全透明。
  • CompositionMode_Source: 仅绘制源图像,忽略目标图像。
  • CompositionMode_Destination: 保留目标图像,忽略源图像。
  • CompositionMode_SourceIn: 显示源图像在目标图像透明部分的交集。
  • CompositionMode_DestinationIn: 显示目标图像在源图像透明部分的交集。
  • CompositionMode_SourceOut: 显示源图像在目标图像不透明部分的区域。
  • CompositionMode_DestinationOut: 显示目标图像在源图像不透明部分的区域。
  • CompositionMode_SourceAtop: 源图像叠加在目标图像不透明部分上,其他部分保持目标图像。
  • CompositionMode_DestinationAtop: 目标图像叠加在源图像不透明部分上,其他部分保持源图像。
  • CompositionMode_Xor: 显示源图像和目标图像的不透明区域的独占或。
SVG 1.2 blend modes(混合模式):

这些模式通常用于高级图形效果,例如通过特定的数学运算混合两幅图像。

  • CompositionMode_Plus: 源图像和目标图像的颜色值相加。
  • CompositionMode_Multiply: 源图像和目标图像的颜色值相乘,结果颜色更暗。
  • CompositionMode_Screen: 源图像和目标图像的颜色值反转相乘,再反转,结果颜色更亮。
  • CompositionMode_Overlay: 源图像和目标图像的颜色值结合,通过不同的算法增强对比度。
  • CompositionMode_Darken: 选择源图像和目标图像中较暗的颜色值。
  • CompositionMode_Lighten: 选择源图像和目标图像中较亮的颜色值。
  • CompositionMode_ColorDodge: 通过增加亮度来使源图像变亮。
  • CompositionMode_ColorBurn: 通过增加亮度来使源图像变暗。
  • CompositionMode_HardLight: 结合MultiplyScreen模式,根据源图像的亮度应用。
  • CompositionMode_SoftLight: 类似于HardLight,但效果更柔和。
  • CompositionMode_Difference: 计算源图像和目标图像的颜色差异。
  • CompositionMode_Exclusion: 类似于Difference,但对比度更低。
ROPs(光栅操作模式):

这些模式源自早期图形硬件中的光栅操作(Raster Operations),用于像素级的图像处理。

  • RasterOp_SourceOrDestination: 源图像和目标图像的像素进行按位或(OR)操作。
  • RasterOp_SourceAndDestination: 源图像和目标图像的像素进行按位与(AND)操作。
  • RasterOp_SourceXorDestination: 源图像和目标图像的像素进行按位异或(XOR)操作。
  • RasterOp_NotSourceAndNotDestination: 源图像和目标图像的像素进行按位非(NOT)和按位与(AND)操作。
  • RasterOp_NotSourceOrNotDestination: 源图像和目标图像的像素进行按位非(NOT)和按位或(OR)操作。
  • RasterOp_NotSourceXorDestination: 源图像和目标图像的像素进行按位非(NOT)和按位异或(XOR)操作。
  • RasterOp_NotSource: 对源图像的像素进行按位非(NOT)操作。
  • RasterOp_NotSourceAndDestination: 对源图像的像素进行按位非(NOT)和目标图像进行按位与(AND)操作。
  • RasterOp_SourceAndNotDestination: 源图像和目标图像的像素进行按位与(AND)和按位非(NOT)操作。
  • RasterOp_NotSourceOrDestination: 对源图像进行按位非(NOT)和目标图像进行按位或(OR)操作。
  • RasterOp_SourceOrNotDestination: 源图像和目标图像的像素进行按位或(OR)和按位非(NOT)操作。
  • RasterOp_ClearDestination: 清除目标图像。
  • RasterOp_SetDestination: 将目标图像设置为全白或全黑。
  • RasterOp_NotDestination: 对目标图像进行按位非(NOT)操作。

2. void setCompositionMode(CompositionMode mode)

  • 这个方法设置QPainter的合成模式。通过传递不同的CompositionMode值,你可以改变QPainter如何将源图像与目标图像进行组合。

3. CompositionMode compositionMode() const

  • 这个方法返回当前QPainter正在使用的合成模式。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QImage SourceImg(200, 200, QImage::Format_ARGB32);
    QImage SrcImg(500, 500, QImage::Format_ARGB32);
    //SourceImg.fill(Qt::transparent);
    //SrcImg.fill(Qt::transparent);
    SourceImg.fill(0);
    SrcImg.fill(0);
    QPainter painter;
    painter.begin(&SourceImg);
    QRect sourceRect(0, 0, 200, 200);
    QColor sourceColor(0, 0, 255, m_sourceOpacity);
    painter.fillRect(sourceRect, sourceColor);
    painter.end();

    painter.begin(&SrcImg);
    painter.save();
    // 设置目标图像为红色矩形
    QRect destinationRect(50, 50, 200, 200);
    QColor srcColor(255, 0, 0, m_srcOpacity);
    painter.fillRect(destinationRect, srcColor);
    // 设置合成模式
    painter.setCompositionMode(currentMode);
    painter.drawImage(0, 0, SourceImg);
    painter.end();

    painter.begin(this);
    painter.drawImage(0, 0, SrcImg);
    painter.end();

}

效果

合成模式

小结

在上面仅仅是把主要合成模式和混和模式添加进来,光栅那个没加,想来也差不多。在做这个例子的时候前期我有一个很大的误区,老是想把QPainter画出的图形直接使用合成模式,结果很悲催,要么没有啥效果,要么效果不符合预期。下面就是错误的代码

	QPainter painter(this);

    // 设置目标图像为红色矩形
    QRect destinationRect(50, 50, 200, 200);
    QColor srcColor(255, 0, 0, m_srcOpacity);
    painter.fillRect(destinationRect, srcColor);
    // 设置合成模式
    painter.setCompositionMode(currentMode);

    QRect sourceRect(0, 0, 200, 200);
    QColor sourceColor(0, 0, 255, m_sourceOpacity);
    painter.fillRect(sourceRect, sourceColor);

给大家看张我设置clear模式的截图
在这里插入图片描述
源图像直接黑掉了,我又查询了许多资料,有的说是我背景颜色没设置好,但是我早就已经在样式表中设置过了,最后才发现是要使用图片,悲催。

还有在设置透明度时我发现有两个不一样的点。

  1. 通过 QPainter::setOpacity() 设置透明度时:

    • 参数的取值范围是 0 到 1,表示透明度的比例。
    • 0 表示完全透明,1 表示完全不透明。
    • 例如:painter.setOpacity(0.5); 会将接下来的绘制操作的透明度设置为 50%。
  2. 通过颜色(QColor)来设置透明度时:

    • 透明度的参数取值范围是 0 到 255,表示颜色的 Alpha 通道值。
    • 0 表示完全透明,255 表示完全不透明。
    • 例如:QColor color(255, 0, 0, 128); 表示一个 50% 不透明的红色(128 是 Alpha 值)或者 color.setAlpha(128)

还有就是img.fill(0)img.fill(Qt::transparent)

1. img.fill(0)
  • 参数: 0 是一个整数值,它代表的是一种颜色。
  • 效果: 当使用 img.fill(0) 时,图像的所有像素将被填充为 纯黑色,并且如果图像的格式支持透明度(例如 QImage::Format_ARGB32),Alpha 通道会被设置为 完全透明
  • 适用场景: 这个方法会将图像填充为黑色,并且如果有透明度,透明度会被设置为完全透明。
2. img.fill(Qt::transparent)
  • 参数: Qt::transparent 是一个颜色常量,表示完全透明。
  • 效果: 使用 img.fill(Qt::transparent) 时,图像的所有像素将被填充为 完全透明。在具有 Alpha 通道的图像格式中(例如 QImage::Format_ARGB32),这意味着所有像素的颜色将是透明的,无论原本的颜色是什么。
  • 适用场景: 这个方法通常用于需要清除图像内容,使图像变得完全透明的时候。

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI作曲工具真的这么神奇?新手也能出音乐!

AI音乐创作工具不仅让专业音乐人有了更多灵感来源,也让普通人能够轻松实现自己的音乐梦想。本文将带你了解如何使用这些工具创作出属于自己的音乐作品。 选择适合的AI音乐创作工具 首先,你需要找到一个适合自己的AI音乐创作平台。市场上有许多选择&…

算法学习019 BFS实现迷踪步 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析

CBFS实现迷踪步 一、题目要求 1、编程实现 有一个 n 行 m 列的方格迷宫,用 0 表示可以通过,用 1 表示不可以通过,每一步可以向上、下、左、右任意方向移动一格,请计算从左上角(1,1)位置移动到右下角(n,m)…

算法的学习笔记—序列化二叉树(牛客JZ37)

😀前言 二叉树是数据结构中的一个重要概念,它在各种算法和应用中广泛使用。然而,当我们需要将二叉树保存到磁盘或在网络中传输时,需要将其转化为一种可存储和传输的格式——这就是序列化的作用。反之,反序列化则是将这…

一款好用且免费的PDF编辑软件:PDFelement

PDFelement是一款多功能的PDF编辑器,可以阅读、编辑、扫描、注释、转换、签名、合并、加密和打印PDF文档。 软件截图: 该版本已授权,可以使用全部功能。 使用说明: 1、将压缩文件解压到某固定位置,不要随意移动&…

视频质量诊断服务 视频质量诊断工具 图像/视频质量分析服务及工具 深度学习视频质量分析系统

文章目录 概要Mongoose介绍算法单机版测试工具算法服务的使用方法小结 概要 根据客户的需求,基于Mongoose平台搭建了视频质量服务系统,该系统主要的功能包含生成base64图像数据、接收post的数据参数推送、视频质量算法分析以及处理结果的推送功能&#x…

【论文阅读】NGD-SLAM: Towards Real-Time SLAM for Dynamic Environments without GPU

arxiv上一篇很新的视觉SLAM论文,能够在不使用GPU的情况下进行语义分割的辅助运算。 一、跟踪流程 作为一个语义结合的视觉SLAM,其基本的思路和以前看过的DynaSLAM基本类似,都是依赖语义分割模型对场景中动态的特征点进行剔除,这…

【OSCP系列】OSCP靶机-Dawn1(原创)

OSCP系列靶机—Dawn1 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 这个靶机需要放在virtualBox 上,那么有关virtualBox 与 VMware 的kali网络通讯方法请访问:【基础知识】…

嵌入式软件开发的面试题

一、硬件电路 1.为什么电路一般使用220uf和104电容并联滤波 220μF电容通常被称为大电容,它具有较高的电容值,能够提供较好的低频滤波效果。它可以有效地滤除较低频率的噪声和干扰信号。这种电容在稳定电源电压、降低纹波和噪声方面非常有用。 另一方面,104电容是指电容值…

[matlab]MATLAB实现MLP多层感知机minist手写识别预测

【测试环境】 matlab2023a 【源码文件截图】 【实现部分代码】 mlp_test.m %% MLP 2-layer to test XOR clear; clc;Mode MNIST %Mode XORif (strcmp(Mode,MNIST))% Load the digits into workspace (MNIST Test, from% http://yann.lecun.com/exdb/mnist/)num_train 100…

el-date-picker 设置值输出格式

el-date-picker 设置值输出格式 现象 在请求后端的时候因为日期格式不对导致后端请求报错 看到时间默认的格式为:2024-08-13T16:00:00.000Z 这个时间如果需要转换成时间格式还是比较费劲的 解决方案 方式1-对字符串进行处理 formatDate(date) {// 格式化为 YY…

Java:常用API:Math类,System类

文章目录 Math常用方法代码 System类常用方法代码 RunTime类常用方法代码 黑马学习笔记 alt回车抛出异常 Math 常用方法 这是static方法,直接Math打点调方法 代码 package com.zhang.math;/*** Author: ggdpzhk* CreateTime: 2024-08-25* Math工具类的基本用法…

build.grade.kts 如何定义插件及插件扩展

定义插件和应用插件 在build.gradle.kts文件内 这里要注意的是&#xff0c;最后一行的Project扩展函数名必须要和上面apply方法里面create的参数一致&#xff0c;然后project扩展函数定义之前必须先apply<>()也就是先使用apply让plugin apply方法运行起来&#xff0c;才…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面 程序员对函数调用栈是再熟悉不过了&#xff0c;无论是使用IDE…

printk的原理及使用

内核驱动调试的方法&#xff0c;先从我最常用的printk的使用方法开始讲起, printk在内核源码中用来记录日志信息的函数&#xff0c;方便我们调试追踪代码&#xff0c;只能在内核源码范围内使用。 本篇内核采用5.10版本。 很多内核开发者最喜欢的调试工具之一是printk(),printk(…

分享一个基于python新闻订阅与分享平台flask新闻发布系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【目标检测】AGMF-Net:遥感目标检测的无注意力全局多尺度融合网络

《Attention-Free Global Multiscale Fusion Network for Remote Sensing Object Detection》 遥感目标检测的无注意力全局多尺度融合网络 原文&#xff1a;https://ieeexplore.ieee.org/document/10371366 摘要 遥感目标检测&#xff08;RSOD&#xff09;在复杂背景和小目标…

设计模式篇(DesignPattern - 前置知识 七大原则)(持续更新调整)

目录 前置知识 一、什么是设计模式 二、设计模式的目的 七大原则 原则一&#xff1a;单一职责原则 一、案例一&#xff1a;交通工具问题 1. 问题分析 2. 解决思路 2.1 类级别单一职责 2.2 方法级别单一职责 3. 知识小结 二、案例二&#xff1a;待更新 原则二&…

本·阿弗莱克在与詹妮弗·洛佩兹离婚期间与孩子塞拉菲娜共度时光

在詹妮弗洛佩兹提出离婚申请期间&#xff0c;本阿弗莱克被发现与塞拉菲娜阿弗莱克一起在加州观看电影。 本阿弗莱克似乎将重心放在家庭时间上&#xff0c;最近有人拍到他带着孩子塞拉菲娜阿弗莱克在一起。此前&#xff0c;他的妻子詹妮弗洛佩兹 于 8 月 20 日星期二提出离婚。 …

小黄鸟九宫格切图丨教你如何将图片九宫格切图_照片分割成9张工具

图片九宫格怎么弄&#xff1f;怎么把1张图片切割称九宫图&#xff1f;如何将一张照片切成九宫格 微博九宫图怎么做&#xff1f;你还不知道电脑上如何做微博九宫格图片? 今天用小黄鸟九宫格切割工具&#xff0c;手把手教你,搞定九宫格切图 小黄九宫格切图丨小黄鸟教你如何九宫…

如何使用ssm实现基于web的药品管理系统+vue

TOC ssm175基于web的药品管理系统vue 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&…