Qt扫盲-QImage 理论总结

news2024/11/16 7:43:20

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); // 0xffbd9527
  image.setPixel(1, 1, value);

  value = qRgb(122, 163, 39); // 0xff7aa327
  image.setPixel(0, 1, value);
  image.setPixel(1, 0, value);

  value = qRgb(237, 187, 51); // 0xffedba31
  image.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); // 0xff7aa327
  image.setColor(0, value);

  value = qRgb(237, 187, 51); // 0xffedba31
  image.setColor(1, value);

  value = qRgb(189, 149, 39); // 0xffbd9527
  image.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.coloradmin.cn/o/1125750.html

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

相关文章

volatile-可见性案例详解

6.3 volatile特性 6.3.1 保证可见性 保证不同线程对某个变量完成操作后结果及时可见,即该共享变量一旦改变所有线程立即可见 不加volatile,没有可见性,程序无法停止 加了volatile,保证可见性,程序可以停止 public…

爱创科技携手洽洽食品,探索渠道数字化最优解!

坚果的下半场,是从吃到喝。 消费升级大潮下,健康养生理念逐渐深入人心。以“天然健康”为核心的食品新消费潮流正加速形成,一个个打着“美味与营养”黄金设定的品类风口正被不断创建,其中人气有增无减的当属植物基饮品。据相关报告…

数据结构详细笔记——树

文章目录 树的定义和基本术语结点、树的属性描述有序树与无序树树与森林 树的常考性质树的存储结构双亲表示法(顺序存储)孩子表示法(顺序链式存储)孩子兄弟表示法(链式存储) 树和森林的遍历树的遍历森林的遍…

JVM、JRE、JDK

JVM JVM(Java Virtual Machine)是Java虚拟机的缩写,他是Java编程语言运行时环境,负责执行Java字节码。另外作为JVM虚拟机,它在各种操作系统上提供统一的平台,这帮助Java应用程序可以独立于操作系统底层运行…

Python自动化测试selenium指定截图文件名方法

这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法,Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试,下文基于python实现指定截图文件名方法,需要的小伙伴可以参考一下 前…

Redis入门概述

Redis入门概述 1.redis是什么 是一种存在内存中的数据库。遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库。并且可以提供提供多种语言的 API。提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。总结来说redis是基于内存…

Ubuntu 下 VSCode Tab 间距非常小解决方案

Ubuntu 的 Tag 键很小,不利于阅读代码,检查 Tab Size 配的也没问题,也是4 解决方案为: 进入 设置-> 字体,把 红框中的 ‘Droid Sans Mono’, 删了 修改后如下: 再次回到代码界面,可以…

【框架源码篇 06】Spring源码题目

Spring源码面试题 谈谈你对Spring框架的理解? Spring 是一个开源的应用程序框架,它起源于 Rod Johnson 在其著名的 Spring Framework 专著中提出的一个轻量级框架的观念。下面是 Spring 的发展历史: 2002 年,Rod Johnson 发表了他的专著 …

硬盘驱动器(HDD)伺服系统鲁棒控制

在存在参数变化、非线性和噪声的情况下,轨道跟踪控制器必须实现更严格的调节。因此,利用闭环伺服系统采用μ合成和H∞优化等先进设计方法,实现鲁棒稳定性和鲁棒性能是合适的。 该磁盘组件由几个被称为圆盘的扁平磁盘组成,其两侧都…

找不到concrt140.dll无法继续执行此代码的解决方法总结,快速解决dll问题的5种方法

最近,我在使用电脑的过程中遇到了一个问题,即“找不到concrt140.dll无法继续执行此代码”。通过查阅资料和自己的实践,我了解到concrt140.dll是Microsoft Visual C 2015 Redistributable中的一个动态链接库文件。它提供了一些用于支持多线程编…

实战公益SRC | 弱口令登录+任意文件上传

目录 附言:从补天的公益src公司中选中了幸运儿。 1. 通过hunter鹰图平台搜索公司的相关资产,发现其采用了华途应用安全网关。 2.访问相关地址,尝试使用弱口令登录,发现直接利用admin/admin就登录了,可以看到后台的相…

Windows平台搭建wxWidgets 3.2.3开发环境

一.基础环境和使用的软件 操作系统:win11mingw工具集:i686-8.1.0-release-win32-sjljIDE:clionwxWidgets头文件:wxWidgets-3.2.3-headerswxWidgets库文件:wxMSW-3.2.3_gcc810_ReleaseDLL PS: 失败很多次才在网上看到, wxWidgets是挑mingw版本的.gcc用8.1,DLL就要用8.1 官网…

springBoot--ssm整合

ssm整合 1、创建项目并添加依赖2、配置数据源3、创建bean文件4、创建接口文件4.1创建接口文件4.2通过插件生成到mapper文件的xml文件4.3通过param进行签名,以后使用指定的名字在sql中取值4.4在sql语句中通过#{}进行取值4.5mapperScan:告诉MyBatis,扫描那个包下面的所…

【Acwing166】数独(dfs+剪枝+位运算)超级详细题解!

本题思路来源于acwing算法提高课 题目描述 看本文需要准备的知识 1.dfs算法基本思想 2.位运算基础 3.对剪枝这个名词的大概了解 剪枝优化位运算优化 常见四种剪枝策略 首先考虑这道题的搜索顺序,很明显,可以随意选择一个空格子,分支为这…

深入理解Java中的AbstractQueuedSynchronizer(AQS):并发编程的核心组件

文章目录 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五…

wait、notify、notifyAll 方法的使用注意事项?

Java全能学习面试指南:https://javaxiaobear.cn 我们主要学习 wait/notify/notifyAll 方法的使用注意事项。 我们主要从三个问题入手: 为什么 wait 方法必须在 synchronized 保护的同步代码中使用?为什么 wait/notify/notifyAll 被定义在 …

基于灰狼算法的无人机航迹规划-附代码

基于灰狼算法的无人机航迹规划 文章目录 基于灰狼算法的无人机航迹规划1.灰狼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用灰狼算法来优化无人机航迹规划。 1.灰狼搜索算法 …

Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式 Python桌面应用之XX学院水卡报表查询系统功能: 连接Oracle数据库,查询XX学院水卡操作总明细报表,汇总数据报表,个人明细报表,进行预览并且支持导出报表 1.总明细报表样式 2.汇总明细样式 3.个人明细…

Proteus仿真--VB上位机程序控制DS1302时钟仿真(Proteus仿真+程序)

本文主要介绍基于51单片机的VB上位机程序控制DS1302时钟仿真设计(完整仿真源文件及代码见文末链接) 简介 硬件电路主要分为单片机主控模块、DS1302模块、LCD1602液晶显示模块以及串口模块 (1)单片机主控模块:单片机选…

Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式,统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等。Ass…