Qt扫盲-QImage 理论总结

QImage 理论总结

  • 一、概述
  • 二、读写图像文件
  • 三、图像信息
  • 四、像素操作
    • 1. 32位
    • 2. 8位
  • 五、图像格式
  • 六、图像转换

一、概述

QImage类提供了一个独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备。Qt提供了四个类来处理图像数据:QImage, QPixmap, QBitmap和QPicture。QImage是为I/O和直接的像素访问和操作而设计和优化的,而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap只是一个继承QPixmap的方便类,确保深度为1。最后,QPicture类是一个绘图设备,用于记录和回放QPainter命令。

因为QImage是QPaintDevice的子类,QPainter可以用来直接在图像上绘图。当在QImage上使用QPainter时,可以在当前GUI线程之外的另一个线程中执行绘图。 这样就可以加快绘制的进度,

QImage类支持由Format枚举描述的几种图像格式。这些包括单色、8位、32位和alpha混合图像,这些图像在所有版本的Qt 4.x中都可用。

QImage提供了一组函数,可用于获取有关图像的各种信息。还有几个功能可以实现图像的转换。

QImage对象可以按值传递,因为QImage类使用隐式数据共享。QImage对象也可以流式传输和比较。

注意:如果你想在Qt的静态构建中加载QImage对象,请参考插件指南。
警告:不支持以QImage::Format_Indexed8格式在QImage上绘画。

二、读写图像文件

QImage提供了几种加载图像文件的方法:文件可以在构造 QImage 对象时加载,也可以稍后使用 load()loadFromData() 函数加载。QImage还提供了静态 fromData() 函数,从给定的数据构造一个QImage。在加载Image时,文件名可以引用磁盘上的实际文件,也可以引用应用程序的一个嵌入式资源。所谓嵌入资源就是用的Qt资源系统中的文件资源。

我们保存文件,只需调用 save() 函数来保存 QImage 对象。

这个类支持的文件格式的完整列表可通过 QImageReader::supportedImageFormats() 和QImageWriter::supportedImageFormats()函数获得。新的文件格式可以作为插件添加。

默认情况下,Qt支持以下格式:

格式格式描述Qt 支持操作
BMPWindows BitmapRead/write
GIFGraphic Interchange Format (optional)Read
JPGJoint Photographic Experts GroupRead/write
JPEGJoint Photographic Experts GroupRead/write
PNGPortable Network GraphicsRead/write
PBMPortable BitmapRead
PGMPortable GraymapRead
PPMPortable PixmapRead/write
XBMX11 BitmapRead/write
XPMX11 PixmapRead/write

三、图像信息

QImage提供了一系列函数,可以用来获取图像的各种信息:

维度可用功能
几何size()、width()、height()、dotsPerMeterX()dotsPerMeterY() 函数提供有关图像大小和长宽比的信息。函数的作用是:返回图像的外围矩形。valid() 函数告诉我们给定的坐标对是否在这个矩形内。offset() 函数返回图像相对于其他图像定位时要偏移的像素数,也可以使用 setOffset() 函数进行操作。
颜色可以通过将其坐标传递给 pixel() 函数来检索像素的颜色。pixel() 函数的作用是:返回与图像格式无关的QRgb值。在单色和8位图像的情况下,colorCount()colorTable() 函数提供有关用于存储图像数据的颜色组件的信息:colorTable() 函数返回图像的整个颜色表。要获取单个条目,请使用 pixelIndex() 函数检索给定坐标对的像素索引,然后使用 color() 函数检索颜色。注意,如果您手动创建一个8位图像,您还必须在图像上设置一个有效的颜色表。hasAlphaChannel() 函数告诉图像的格式是否符合alpha通道。allGray()isGrayscale() 函数判断图像的颜色是否都是灰度。参见像素操作和图像转换部分。
文本text() 函数的作用是:返回与给定文本键相关联的图像文本。可以使用 textKeys() 函数检索图像的文本键。使用 setText() 函数来修改图像的文本。
低层次的信息depth() 函数的作用是:返回图像的深度。支持的深度有1位(单色)、8位、16位、24位和32位。bitPlaneCount() 函数告诉我们使用了多少位。有关更多信息,请参阅图像格式部分。format()、bytesPerLine()和sizeInBytes()函数提供有关图像中存储的数据的低级信息。cacheKey() 函数返回一个唯一标识内容的数字

四、像素操作

用于操作图像像素的函数取决于图像格式。原因是单色和8位图像是基于索引的,并且使用颜色查找表,而32位图像直接存储ARGB值。有关图像格式的更多信息,请参阅图像格式部分。

1. 32位

对于32位图像,可以使用setPixel()函数将给定坐标处的像素颜色更改为指定为ARGB四重组的任何其他颜色。要创建合适的QRgb值,请使用QRgb()(为给定的RGB值添加默认alpha组件,即创建不透明的颜色)或qRgba()函数。例如:

在这里插入图片描述 |

  QImage image(3, 3, QImage::Format_RGB32);QRgb value;value = qRgb(189, 149, 39); // 0xffbd9527image.setPixel(1, 1, value);value = qRgb(122, 163, 39); // 0xff7aa327image.setPixel(0, 1, value);image.setPixel(1, 0, value);value = qRgb(237, 187, 51); // 0xffedba31image.setPixel(2, 1, value);

2. 8位

在8位和单色图像的情况下,像素值只是图像颜色表中的索引。所以setPixel()函数只能用来改变给定坐标下像素的颜色,从图像的颜色表中选择一个预定义的颜色,也就是说,它只能改变像素的索引值。要更改或添加图像颜色表的颜色,请使用setColor()函数。(就像下面只有8个颜色的选择值)

颜色表中的条目是编码为QRgb值的ARGB四元组。使用qRgb()和qRgba()函数创建一个合适的qRgb值,以便与setColor()函数一起使用。例如:

8位

  QImage image(3, 3, QImage::Format_Indexed8);QRgb value;value = qRgb(122, 163, 39); // 0xff7aa327image.setColor(0, value);value = qRgb(237, 187, 51); // 0xffedba31image.setColor(1, value);value = qRgb(189, 149, 39); // 0xffbd9527image.setColor(2, value);image.setPixel(0, 1, 0);image.setPixel(1, 0, 0);image.setPixel(1, 1, 2);image.setPixel(2, 1, 1);

对于每个颜色通道超过8位的图像。setPixelColor()和pixelColor()方法可用于设置和获取QColor值。

QImage还提供了scanLine()函数,该函数返回指向具有给定索引的扫描线上的像素数据的指针,以及bits()函数,该函数返回指向第一个像素数据的指针(这相当于scanLine(0))。

五、图像格式

存储在QImage中的每个像素都用一个整数表示。整数的大小取决于格式。QImage支持由Format enum描述的几种图像格式。

单色图像使用1位索引存储到最多有两种颜色的颜色表中。有两种不同类型的单色图像:大端序(MSB优先)或小端序(LSB优先)位顺序。

8位图像使用8位索引存储到颜色表中,即每个像素有一个字节。颜色表是一个QVector, QRgb类型定义相当于一个unsigned int,包含格式为0xAARRGGBB的ARGB四元组。

32位图像没有色表;相反,每个像素包含一个QRgb值。有三种不同类型的32位图像分别存储RGB(即0xffRRGGBB), ARGB和预乘ARGB值。在预乘格式中,红色、绿色和蓝色通道乘以alpha分量除以255。

可以使用format()函数检索图像的格式。使用convertToFormat()函数将图像转换为另一种格式。allGray()和isGrayscale()函数告诉我们是否可以安全地将彩色图像转换为灰度图像。

六、图像转换

QImage支持许多用于创建原始图像的转换版本的新图像的函数:createalphaask()函数从该图像中的alpha缓冲区构建并返回一个1-bpp的掩码,createHeuristicMask()函数为该图像创建并返回一个1-bpp的启发式掩码。后一个函数的工作原理是从其中一个角选择一种颜色,然后从所有边缘开始切割该颜色的像素。

mirrored()函数返回所需方向的图像镜像,scaled()返回缩放到所需尺寸矩形的图像副本,rgbswap()函数从RGB图像构造BGR图像。
scaledToWidth()和scaledToHeight()函数返回图像的缩放副本。

transform()函数返回用给定的变换矩阵和变换模式变换的图像的副本:在内部,变换矩阵被调整以补偿不需要的平移,即transforms()返回包含原始图像的所有变换点的最小图像。静态truemmatrix()函数返回用于转换图像的实际矩阵。

还有一些函数可以用来改变图像的属性:

函数描述
setDotsPerMeterX()通过设置在物理仪表中水平匹配的像素数来定义宽高比。
setDotsPerMeterY()通过设置在物理仪表中垂直匹配的像素数来定义宽高比。
fill()用给定的像素值填充整个图像。
invertPixels ()使用给定的InvertMode值反转图像中的所有像素值。
setColorTable ()设置用于转换颜色索引的颜色表。只有单色和8位格式。
setColorCount ()调整颜色表的大小。只有单色和8位格式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯(路径 动态规划 C++)

思路: 1、利用动态规划的思想。 2、用f[i]来记录从第一个点到第i个点的最短距离。 3、f[i]赋值分两种情况,第一种:f[i]为0的时候,也就是第一种刚到i点的情况,记录其距离为最小公倍数;第二种:…

2023年【危险化学品生产单位主要负责人】考试报名及危险化学品生产单位主要负责人模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位主要负责人考试报名考前必练!安全生产模拟考试一点通每个月更新危险化学品生产单位主要负责人模拟考试题题目及答案!多做几遍,其实通过危险化学品生产单位主要负…

Plex Media Server for Mac: 打造您的专属媒体库

在数字媒体时代,我们越来越依赖各种媒体应用来丰富我们的生活。其中,Plex Media Server for Mac以其高效、稳定和多功能性,逐渐成为了Mac用户们的首选。今天,我们就来深入探讨这款个人媒体软件的优势和应用场景。 Plex Media Serv…

Kafka与MySQL的组合使用

根据上面给出的student表,编写Python程序完成如下操作: (1)读取student表的数据内容,将其转为JSON格式,发送给Kafka; 创建Student表的SQL语句如下: create table student( sno ch…

类似东郊到家预约家政保洁小程序搭建

随着生活水平的提高,人们对健康养生的需求越来越重视,按摩作为一种传统的养生方式,备受关注。为了方便用户快速、方便地预约按摩服务,本文将介绍一款按摩预约小程序的开发。 首先,我们通过市场调研和分析发现&#xf…

网络协议--IP:网际协议

3.1 引言 IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输(见图1-4)。许多刚开始接触TCP/IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪。 不可靠(unreliable)的意思是它不能…

2023年中国监控光端机优点、市场规模及发展前景分析[图]

监控光端机是一种用于光纤通信网络的设备,用于连接光纤到用户设备(如计算机、路由器等)。监控光端机行业涉及制造、销售和维护这些设备,以确保高速、稳定的光纤通信连接,适用于家庭、企业和数据中心等不同应用场景。 …

Python创建条形图加点重叠

目录 代码效果图 要使用Python的Seaborn库创建一个条形图加点重叠的统计图,可以使用 seaborn.barplot和 seaborn.stripplot函数。以下是一个论文级别的简单示例代码,演示如何创建这种效果的图 代码 import seaborn as sns import matplotlib.pyplot a…

MSQL系列(七) Mysql实战-SQL语句Join,exists,in的区别

Mysql实战-SQL语句Join,exists,in的区别 前面我们讲解了索引的存储结构,BTree的索引结构,以及索引最左侧匹配原则及讲解一下常用的SQL语句的优化建议,今天我们来详细讲解一下 我们经常使用的 join, exist&…

一种融合偶然和认知不确定性的贝叶斯深度学习RUL框架

_原文: _《《A Bayesian Deep Learning RUL Framework Integrating Epistemic and Aleatoric Uncertainties》 _作者__: _Gaoyang Lia,Li Yangb,Chi-Guhn Leec,Xiaohua Wangd,Mingzhe Ronge _作者单位&am…

统信uos 1030 企业版 安装.net core环境

安装.net core步骤 添加密钥和包存储库 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-mic…

VMwarePlayer安装Ubuntu,切换中文并安装中文输入法

1.下载和安装 虚拟机使用的免费版官网链接:VMwarePlayer Ubuntu镜像下载官网链接:Ubuntu桌面版 自己学习使用,不需要考虑迁移之类的。选择单个磁盘IO性能会更高 安装过程中如果出现如下报错,则用系统管理员身份运行 右击VMwa…

18-spring 事务

文章目录 1. xml和注解配置方式的对象2.spring事务传播特性3. 注解事务的初始化流程4. 创建事务信息流程图5. 事务回滚流程图 1. xml和注解配置方式的对象 2.spring事务传播特性 事务传播行为类型说明PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务&#xf…

Docker 的数据管理与网络通信以及Docker镜像的创建

目录 Docker的数据管理 1、数据卷 2、数据卷容器 3、端口映射 4、容器互联 二、Docker网络 1、Docker网络实现原理 2、Docker的网桥模式 1)Host 2)Container 3)none 4)bridge 5)自定义网络 3、创建自定义…

算法学习(四)将一颗二叉搜索树转排序的双向链表

描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000 要求:空间复杂度O(1)O(1)&#x…

使用 Requests 库和 PHP 的下载

以下是一个使用 Requests 库和 PHP 的下载器程序,用于从 www.people.com.cn 下载音频。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 import requests from bs4 import BeautifulSoup import pafy import timedef get_proxy():url "https://www.…

Linux驱动基础篇(一)GPIO(上)LED驱动

文章目录 Linux驱动基础(一)GPIO(上)LED驱动一、开发环境准备1.安装交叉编译工具编译内核(1)安装交叉编译工具(2)修改Makefile指定编译器和架构(3)生成配置文…

《java核心卷Ⅰ》知识点总结(可作面试题)

🛫 JDK和JRE傻傻分不清?🛫 HelloWorld的输出都经历了啥?🛫 Java的三个版本都是啥?🛫 关于main方法你都知道啥?main方法被声明为private会怎样?🛫 强制and自动类型转换都…

Unity解决:导出AndroidStudio工程 出现如下报错的解决方法

unity2019.4+ androidStudio2023.x+ 问题1: cvc-complex-type.2.4.a: 发现了以元素 base-extension 开头的无效内容。应以 {layoutlib} 之一开头。 解决:第一个Build.gradle更改如下 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING …

中文编程开发语言工具系统化教程初级1上线

中文编程系统化教程初级1 学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法 可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,…