QImage使用说明

article/2025/10/19 5:30:24

详细描述

QImage类提供独立于硬件的图像表示,允许直接访问像素数据,并可用作绘制设备。

Qt提供了四个用于处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。QImage针对I/O、直接像素访问和操作进行了设计和优化,而QPixmap针对在屏幕上显示图像进行了设计和优化。QBitmap只是一个继承QPixmap的方便类,确保深度为1。最后,QPicture类是一个绘画设备,用于记录和重放QPaint命令。

由于QImage是QPaintDevice子类,QPainter可用于直接绘制图像。在QImage上使用QPaint时,可以在当前GUI线程之外的其他线程中执行绘制。相当于QImage使用不需要启动GUI线程,但是QPixmap需要启动GUI线程.

报错代码:

#include <QCoreApplication>
#include <QPixmap>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QPixmap b;b.load("/home/arv000/Desktop/2222.png");return a.exec();
}

报错信息: 因为QPixmap需要GUI线程中运行.

QPlatformPixmap: QGuiApplication required
[1]    2864 abort      ./test

一下代码不报错

#include <QCoreApplication>
#include <QImage>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QImage b;b.load("/home/arv000/Desktop/2222.png");return a.exec();
}

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

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

由于QImage类使用隐式数据共享,因此可以通过值传递QImage对象。QImage对象也可以流化和比较。

警告:不支持使用格式QImage::format_Indexed8在QImage上绘制。

读写QImage文件

QImage提供了几种加载图像文件的方法:可以在构造QImage对象时加载该文件,也可以稍后使用load()或loadFromData()函数加载该文件。

QImage还提供了静态fromData()函数,从给定数据构造一个QImage。加载映像时,文件名可以指磁盘上的实际文件,也可以指应用程序的嵌入式资源之一。有关如何在应用程序的可执行文件中嵌入图像和其他资源文件的详细信息,请参阅Qt资源系统概述。

只需调用save()函数来保存一个QImage对象。        

支持的文件格式的完整列表可通过QImageReader::SupporteImage_formats()和QImageWriter::SupporteImage_formats()函数获得。新的文件格式可以作为插件添加。默认情况下,Qt支持以下格式:

Format

Description

Qt's support

BMP

Windows Bitmap

Read/write

GIF

Graphic Interchange Format (optional)

Read

JPG

Joint Photographic Experts Group

Read/write

JPEG

Joint Photographic Experts Group

Read/write

PNG

Portable Network Graphics

Read/write

PBM

Portable Bitmap

Read

PGM

Portable Graymap

Read

PPM

Portable Pixmap

Read/write

XBM

X11 Bitmap

Read/write

XPM

X11 Pixmap

Read/write

像素操作

用于操纵图像像素的函数取决于图像格式。原因是单色和8位图像基于索引,使用颜色查找表,而32位图像直接存储ARGB值。有关图像格式的详细信息,请参见“图像格式”部分。

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

32-bit 

对于8位和monchrome图像,像素值只是图像颜色表中的索引。因此,setPixel()函数只能用于将给定坐标下的像素颜色更改为图像颜色表中的预定义颜色,即它只能更改像素的索引值。要更改或向图像的颜色表添加颜色,请使用setColor()函数。

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

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

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

图像格式

QImage中存储的每个像素都由一个整数表示。整数的大小因格式而异。QImage支持格式枚举描述的几种图像格式。

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

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

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

可以使用format()函数检索图像的格式。使用convertToFormat()函数将图像转换为其他格式。allGray()和isGrayscale()函数用于判断彩色图像是否可以安全地转换为灰度图像。

图像变换

QImage支持许多函数来创建原始图像的转换版本的新图像:createAlphaMask()函数从该图像的alpha缓冲区生成并返回1-bpp的掩码,createHeuristicMask()函数为该图像创建并返回1-bpp的启发式掩码。后一种功能的工作原理是从一个角选择一种颜色,然后从所有边缘开始去除该颜色的像素。

Function

Description

setDotsPerMeterX()

通过设置物理仪表中水平适合的像素数来定义纵横比

setDotsPerMeterY()

通过设置物理仪表中垂直适合的像素数来定义纵横比。

fill()

用给定的像素值填充整个图像。

invertPixels()

使用给定的反转模式值反转图像中的所有像素值。

setColorTable()

设置用于转换颜色索引的颜色表。仅单色和8位格式。

setColorCount()

调整颜色表的大小。仅单色和8位格式。

图片格式

QImage::Format

Constant

Value

Description

QImage::Format_Invalid

0

这个图片是无效的

QImage::Format_Mono

1

图像以每像素1位的方式存储。字节首先用最高有效位(MSB)打包.

QImage::Format_MonoLSB

2

图像以每像素1位的方式存储。字节首先用低有效位(LSB)进行压缩。

QImage::Format_Indexed8

3

使用8位索引将图像存储到colormap中。

QImage::Format_RGB32

4

图像使用32位RGB格式(0xffRRGGBB)存储。

QImage::Format_ARGB32

5

图像使用32位ARGB格式(0xAARRGGBB)存储。

QImage::Format_ARGB32_Premultiplied

6

图像使用预乘32位ARGB格式(0xAARRGGBB)存储,即红色、绿色和蓝色通道乘以alpha分量除以255。(如果RR、GG或BB的值高于alpha通道,则结果未定义。)某些操作(例如使用alpha混合的图像合成)使用预乘ARGB32比使用普通ARGB32更快。

QImage::Format_RGB16

7

图像使用16位RGB格式(5-6-5)存储。

QImage::Format_ARGB8565_Premultiplied

8

图像使用预乘24位ARGB格式(8-5-6-5)存储。

QImage::Format_RGB666

9

The image is stored using a 24-bit RGB format (6-6-6). The unused most significant bits is always zero.

QImage::Format_ARGB6666_Premultiplied

10

The image is stored using a premultiplied 24-bit ARGB format (6-6-6-6).

QImage::Format_RGB555

11

The image is stored using a 16-bit RGB format (5-5-5). The unused most significant bit is always zero.

QImage::Format_ARGB8555_Premultiplied

12

The image is stored using a premultiplied 24-bit ARGB format (8-5-5-5).

QImage::Format_RGB888

13

The image is stored using a 24-bit RGB format (8-8-8).

QImage::Format_RGB444

14

The image is stored using a 16-bit RGB format (4-4-4). The unused bits are always zero.

QImage::Format_ARGB4444_Premultiplied

15

The image is stored using a premultiplied 16-bit ARGB format (4-4-4-4).

QImage::Format_RGBX8888

16

The image is stored using a 32-bit byte-ordered RGB(x) format (8-8-8-8). This is the same as the Format_RGBA8888 except alpha must always be 255.

QImage::Format_RGBA8888

17

The image is stored using a 32-bit byte-ordered RGBA format (8-8-8-8). Unlike ARGB32 this is a byte-ordered format, which means the 32bit encoding differs between big endian and little endian architectures, being respectively (0xRRGGBBAA) and (0xAABBGGRR). The order of the colors is the same on any architecture if read as bytes 0xRR,0xGG,0xBB,0xAA.

QImage::Format_RGBA8888_Premultiplied

18

The image is stored using a premultiplied 32-bit byte-ordered RGBA format (8-8-8-8).

QImage::Format_BGR30

19

The image is stored using a 32-bit BGR format (x-10-10-10).

QImage::Format_A2BGR30_Premultiplied

20

The image is stored using a 32-bit premultiplied ABGR format (2-10-10-10).

QImage::Format_RGB30

21

The image is stored using a 32-bit RGB format (x-10-10-10).

QImage::Format_A2RGB30_Premultiplied

22

The image is stored using a 32-bit premultiplied ARGB format (2-10-10-10).

QImage::Format_Alpha8

23

The image is stored using an 8-bit alpha only format.

QImage::Format_Grayscale8

24

The image is stored using an 8-bit grayscale format.


http://chatgpt.dhexx.cn/article/TOviMqNB.shtml

相关文章

QImage类详解(QImage类型转换、QImage类函数及QImage像素操作)

QImage类&#xff08;QImage类型转换、QImage类函数及QImage像素操作&#xff09; 打开Qt帮助文档&#xff0c;会看到有关于QImage的描述如下&#xff1a;The QImage class provides a hardware-independent image representation that allows direct access to the pixel dat…

J1939 协议

J1939 协议简介 J1939协议是基于CAN 2.0B所发展的出来的&#xff0c;基于CAN 的物理层。主要用于commercial vehicle的通信。J1939的主要目的是制定统一的上层application诊断的信息。 J1939的最大特点是定义了PGN&#xff08;Parameter Group Number). 大多数的PGN是8个字节…

SAE J1939学习笔记(三)

J1939故障代码种类 J1939 由几个不同的诊断信息&#xff1a; –诊断信息 1 - DM1 – 现行故障代码 –诊断信息 2 - DM2 – 非现行故障代码 –诊断信息 3 - DM3 – 清除非现行故障代码 通常地&#xff0c;用户会用 DM1 信息来读取现行故障码。 DM1 信息是 PGN 65226 or FECA h…

新功能发布—TSMaster如何实现J1939多帧报文收发

前言 众所周知&#xff0c;J1939协议是由美国汽车工程师协会&#xff08;SAE&#xff09;定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。如今大多数车辆都通过CAN进行ECU通信。但是CAN总线仅仅是提供了通信的基础&#xff08;就像是电话&#xff09;&…

CAN协议 J1939

转自&#xff1a;http://blog.sina.com.cn/s/blog_bf97bd7e0102wl2y.html 这几天在公司看了SAE推行的 J1939标准&#xff08;SAE&#xff1a;美国汽车工程协会&#xff09;&#xff0c;这里整理下学习要点&#xff0c;主要包含以下几个协议&#xff1a; 物理层 SAE J1939-11…

J1939协议与CAN2.0对应关系图表

SAE J1939 消息帧格式定义与CAN 2.0B帧格式对应关系 J1939应用层协议详细描述了用于J1939网络的每个参数&#xff0c;包括其数据长度、数据类型、分辨率、范围及参考标签&#xff0c;并为每个参数分配了一个编号&#xff08;SPN&#xff09;。由于J1939协议是以协议数据单元&am…

Python实现CAN总线J1939报文接收、发送

前言 J1939协议是由美国汽车工程师协会&#xff08;SAE&#xff09; (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面&#xff0c;J1939标准类似于旧版J1708和J1587标准&#xff0c;但J1939标准协议建立在CAN&#xff08;控制器区域…

J1939标准概述【小白入门】

文章目录 J1939标准概述&#xff1a;J1939/11物理层J1939/13板外诊断连接器J1939/21数据链路层J1939/31网络层J1939/71车辆应用层J1939/73应用层-诊断层J1939/81网络管理总结 J1939标准概述&#xff1a; J1939由下列子标准组成&#xff1a; J1939 – 串行控制和通信车辆网络…

J1939-21数据链路层多帧协议PDU解析

一、协议数据单元&#xff08;PDU&#xff09; P 是优先级&#xff0c;R 是保留位&#xff0c;DP 是数据页&#xff0c;PF 是PDU 格式&#xff0c;PS 是特定PDU&#xff0c;SA 是源地址 优先级&#xff08;P&#xff09;&#xff1a;这三位仅在总线传输中用来优化消息延迟&…

CAN总线的特点及J1939协议通信原理、内容和应用

众多国际知名汽车公司早在20世纪80年代就积极致力于汽车网络技术的研究及应用。迄今已有多种网络标准&#xff0c;如专门用于货车和客车上的SAE的J1939、德国大众的ABUS、博世的CAN、美国商用机器的AutoCAN、ISO的VAN、马自达的PALMNET等。 在我国的轿车中已基本具有电子控制和…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性&#xff0c;功能也较单一&#xff0c;且具有产量小的特点&#xff0c;因此在设计开发时需要进行约束&#xff0c;以更大程度实现软硬件的复用和成本的降低&#xff0c;在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…

SAE J1939协议读取车辆故障码

基于SAE J1939协议的车辆&#xff0c;默认开启数据广播。当有故障码时&#xff0c;也会按照故障码的格式进行广播。 此处基于外设主动&#xff1a;读取故障码个数->读取故障码->故障码解析 这个步骤来讲&#xff0c;如果被动接收故障码广播&#xff0c;如下解析也适用。 …

车用总线技术 | J1939协议实用指南与J1939数据记录方案

“没错&#xff0c;这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇&#xff1a;在这篇介绍中&#xff0c;我们介绍了J1939协议的基本知识&#xff0c;其中包括PGN和SPN。因为这是一篇偏向应用的简介&#xff0c;所以您还将会学习到如何通过DBC文件解码J1939数据、如何…

SAE J1939协议学习笔记

引用百度百科&#xff1a; SAE J1939&#xff08;以下简称J1939&#xff09;是美国汽车工程协会&#xff08;SAE&#xff09;的推荐标准&#xff0c;用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”&#xff08;Track &am…

J1939学习(二)

PDU 应用或网络层提供被同化为协议数据单元&#xff08;PDU&#xff09;的信息串。PDU提供了一个框架&#xff0c;用于组织对发送的每个CAN数据帧至关重要的信息。SAE J1939 PDU由七个字段组成&#xff1a;&#xff08;1&#xff09;P、&#xff08;2&#xff09;EDP、&#x…

CAN总线(J1939)速成指南【1】

本文转载在我的微信公众号&#xff1a;古德曼汽车工业。公众号文章都会知识星球、知乎进行转载&#xff0c;请有兴趣的朋友可以关注我的微信公众号 原文地址&#xff1a;CAN总线(J1939)速成指南【1】 很久以前当思想对CAN总线还一窍不通的时候&#xff0c;尝试百度搜索过非常…

J1939协议实用指南与J1939数据记录方案

“没错&#xff0c;这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇&#xff1a;在这篇介绍中&#xff0c;我们介绍了J1939协议的基本知识&#xff0c;其中包括PGN和SPN。因为这是一篇偏向应用的简介&#xff0c;所以您还将会学习到如何通过DBC文件解码J1939数据、如何记…

车载通信——J1939故障码

一、诊断 UDS是统一诊断系统 冻结帧&#xff1a;出现故障码时&#xff0c;ECU存储故障码出现时的数据&#xff0c;就是冻结帧。 二、J1939故障诊断 SAE J1939应用层定义了12种诊断报文&#xff08;Diagnostic Message,DM&#xff09;、诊断故障码&#xff08;DTC&#xff0…

UDS,ISO14229,ISO15765,ISO15031,J1939车辆诊断协议入门系列

&#xff08;图片来源于网络&#xff09; 目录 摘要1. 基础概念1.1 诊断的概念1.2 诊断的目标1.3 诊断的实现1.4 诊断是分层的 2. 项目应用3. 协议栈开发 摘要 回想当年刚进去汽车行业&#xff0c;做新能源车的某个“ECU”&#xff0c;和客户沟通需求时&#xff0c;人家上来就…

J1939故障码诊断说明

1&#xff1a;1939整体协议说明 这里主要说明1939不同的协议&#xff0c;对应不同的网络分层 注意了&#xff0c;这里只进行文档解析说明&#xff0c;具体查看去搜素协议的关键字进行理解 2&#xff1a;DMx和FMI 说明 想知道每个代号的具体含义&#xff0c;可以去 saeJ1939…