QImage

article/2025/10/19 5:34:15

一、描述

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

QImage 是为 I/O 和直接像素访问和操作而设计和优化的,

因为 QImage 是 QPaintDevice 的子类,所以 QPainter 可用于直接在图像上绘图。在 QImage 上使用 QPainter 时,可以在当前 GUI 线程之外的另一个线程中执行绘画

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

1.1、像素操作

用于处理图像像素的函数取决于图像格式。原因是单色和 8 位图像基于索引并使用颜色查找表,而 32 位图像直接存储 ARGB 值。

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

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

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

1.2、QRgb

#AARRGGBB 格式的 ARGB 四元组,等效于无符号整数。

该类型还保存 alpha 通道的值。默认的 alpha 通道是 ff,即不透明。 

创建 QRgb 值的一些示例:

const QRgb rgb1 = 0x88112233;
const QRgb rgb2 = QColor("red").rgb();
const QRgb rgb3 = qRgb(qRed(rgb1), qGreen(rgb2), qBlue(rgb2));
const QRgb rgb4 = qRgba(qRed(rgb1), qGreen(rgb2), qBlue(rgb2), qAlpha(rgb1));

使用 qAlpha()、qRed()、qGreen() 和 qBlue() 函数获取颜色值分量。

1.3、图像格式

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

  • 单色图像:使用 1 位索引存储到最多具有两种颜色的颜色表中。有两种不同类型的单色图像:大端(MSB 优先)或小端(LSB 优先)位顺序。
  • 8 位图像:使用 8 位索引存储到颜色表中,即它们每个像素有一个字节。颜色表是一个 QList<QRgb>。
  • 32 位图像:没有颜色表,每个像素都包含一个 QRgb 值。

二、类型成员

1、enum QImage::Format:在 Qt 中可用的图像格式。略。

注意:

  • 不支持 Format_Indexed8 格式的绘制。
  • 使用 QPainter 绘制的最佳格式为 Format_RGB32 Format_ARGB32_Premultiplied 格式,其次是 Format_RGB16Format_RGBX8888Format_RGBA8888_PremultipliedFormat_RGBX64 Format_RGBA64_Premultiplied 格式。其他格式不建议使用 QPainter 绘制(绘制效果不佳)。

2、enum QImage::InvertMode:此枚举用于描述如何在 invertPixels() 函数中反转像素值。

  • InvertRgb:仅反转 RGB 值并保持 Alpha 通道不变。
  • InvertRgba:反转所有通道,包括 alpha 通道。

三、部分成员函数

1、QImage rgbSwapped()

返回一个 QImage,其中所有像素的红色和蓝色分量的值已被交换,有效地将 RGB 图像转换为 BGR 图像。原始的 QImage 没有改变。

      void rgbSwap()

交换所有像素的红色和蓝色分量的值,将 RGB 图像转换为 BGR 图像。 

#include <QApplication>
#include <QLabel>
#include <QHBoxLayout>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;QImage img("D:/6.png");QLabel src;src.setPixmap(QPixmap::fromImage(img));QLabel dst;dst.setPixmap(QPixmap::fromImage(img.rgbSwapped()));QHBoxLayout hb(&w);hb.addWidget(&src);hb.addWidget(&dst);w.show();return a.exec();
}

2、QImage mirrored(bool horizontal = false, bool vertical = true)

返回图像的镜像,在水平和/或垂直方向上镜像。原始图像不会更改。

      void mirror(bool horizontal = false, bool vertical = true)

图像在水平和/或垂直方向上镜像。 

    dst.setPixmap(QPixmap::fromImage(img.mirrored(0,1)));

    dst.setPixmap(QPixmap::fromImage(img.mirrored(1,0)));

    dst.setPixmap(QPixmap::fromImage(img.mirrored(1,1)));

3、QImage convertedTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)

     QImage convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)

格式转换,返回转换后的图像副本。参数2控制在转换过程中如何处理图像数据。

4、QImage(const QString &fileName, const char *format = nullptr)

构造一个图像并尝试从具有给定文件名的文件中加载图像。

尝试使用指定格式读取图像。如果未指定格式,则会根据文件的后缀和标题自动检测。

如果图像加载失败,则此对象为空图像。

5、QImage(const char *const [] xpm)

从给定的 xpm 图像构造图像。可参考。

6、bool allGray() const

图像中的所有颜色是否都是灰色(即它们的R、G、B分量相等)。

对于没有颜色表的图像,此功能很慢。

7、uchar * bits()

返回指向第一个像素数据的指针。

8、QImage copy(const QRect &rectangle = QRect())

将图像的子区域作为新图像返回。(深拷贝)

返回的图像是从该图像中的位置 (rectangle.x(), rectangle.y()) 复制的,并且始终具有给定矩形的大小。

在此图像之外的区域,像素设置为 0:

  • 对于 32 位 RGB 图像,这意味着黑色
  • 对于 32 位 ARGB 图像,这意味着透明黑色
  • 对于 8 位图像,这意味着颜色表中索引为 0 的颜色可以是任何颜色
  • 对于 1 位图像,这意味着 Qt::color0

如果参数的矩形是空矩形,则复制整个图像。

9、int depth()

图像的深度。图像深度是用于存储单个像素的位数,也称为每像素位数 (bpp)。

支持的深度为 1、8、16、24、32 和 64。

10、void fill(const QColor &color)

用给定的颜色填充整个图像。 

11、【static】QImage fromData(const QByteArray &data, const char *format = nullptr)

从给定的 QByteArray 数据构造图像。将尝试使用指定格式读取图像。如果未指定格式,则会探测数据以查找标头以猜测文件格式。

如果指定了格式,它必须是 QImageReader::supportedImageFormats() 返回的值之一。

如果图片加载失败,则返回的图片为空图片。

12、bool hasAlphaChannel()

图像是否具有 alpha 通道的格式。

13、void invertPixels(QImage::InvertMode mode = InvertRgb)

反转图像中的所有像素值。

给定的反转模式仅在图像深度为 32 时才有意义。

反转 8 位图像意味着将使用颜色索引 i 的所有像素替换为使用颜色索引 255 减去 i 的像素。 1 位图像的情况也是如此。

#include <QApplication>
#include <QLabel>
#include <QHBoxLayout>
#include <QColorTransform>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;QImage img("D:/6.png");QLabel src;src.setPixmap(QPixmap::fromImage(img));QLabel dst;img.invertPixels();dst.setPixmap(QPixmap::fromImage(img));QHBoxLayout hb(&w);hb.addWidget(&src);hb.addWidget(&dst);w.show();return a.exec();
}

14、bool load(const QString &fileName, const char *format = nullptr)

从具有给定文件名的文件中加载图像。返回是否加载成功。

加载器尝试使用指定的格式读取图像,例如 PNG 或 JPG。 如果未指定格式,则会根据文件的后缀和标题自动检测。

      bool load(QIODevice *device, const char *format)

此函数从给定设备读取 QImage。 例如,这可以用于将图像直接加载到 QByteArray 中。

15、bool loadFromData(const QByteArray &data, const char *format = nullptr)

从给定的数据加载图像。返回是否加载成功。

16、bool save(const QString &fileName, const char *format = nullptr, int quality = -1)

使用给定的图像文件格式和质量因子将图像保存到具有给定文件名的文件中。如果 format 为 nullptr,QImage 将尝试通过查看 fileName 的后缀来猜测格式。

质量因子必须在 0 到 100 或 -1 的范围内。指定 0 获取小压缩文件,指定 100 获取大未压缩文件,指定 -1(默认值)使用默认设置。

返回图像是否保存成功。

      bool save(QIODevice *device, const char *format = nullptr, int quality = -1)

此函数将 QImage 写入给定设备。

例如,这可以用于将图像直接保存到 QByteArray 中:

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");

17、QImage scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation)

返回缩放为 size 的图像副本。

enum Qt::AspectRatioMode:此枚举类型定义了缩放矩形时长宽比发生的变化。

  • Qt::IgnoreAspectRatio:自由缩放,不保留纵横比。
  • Qt::KeepAspectRatio:缩放到给定矩形内尽可能大的矩形,保持纵横比。
  • Qt::KeepAspectRatioByExpanding:缩放到给定矩形外尽可能小的矩形,保持纵横比。

enum Qt::TransformationMode:此枚举类型定义图像转换是否应该平滑。

  • Qt::FastTransformation:转换快速执行,没有平滑。
  • Qt::SmoothTransformation:使用双线性过滤转换生成的图像。

18、QImage scaledToHeight(int height, Qt::TransformationMode mode = Qt::FastTransformation)

       QImage scaledToWidth(int width, Qt::TransformationMode mode = Qt::FastTransformation)

返回的图像使用指定的转换模式缩放到给定的高度 / 宽度。

会自动计算图像的宽度 / 高度,以便保留图像的比例。

19、uchar * scanLine(int i)

返回指向索引为 i 的扫描线处的像素数据的指针。第一个扫描线位于索引 0。

扫描线数据至少 32 位对齐。对于 64 位格式,它遵循 64 位整数的本机对齐方式(大多数平台为 64 位,但在 i386 上尤其是 32 位)。

例如,要去除图像中每个像素的绿色分量:

for (int y = 0; y < image.height(); ++y) {QRgb *line = reinterpret_cast<QRgb*>(image.scanLine(y));for (int x = 0; x < image.width(); ++x) {QRgb &rgb = line[x];rgb = qRgba(qRed(rgb), qGreen(0), qBlue(rgb), qAlpha(rgb));}
}

 20、void  setAlphaChannel (const QImage & alphaChannel )

将此图像的 alpha 通道设置为给定的alphaChannel。

如果alphaChannel是 8 位 alpha 图像,则直接使用 alpha 值。否则,将 alphaChannel转换为 8 位灰度图像。

如果图像已有 Alpha 通道,则现有的 Alpha 通道将与新通道相乘。如果图像没有 alpha 通道,它将被转换为有的格式。

该操作类似于使用 QPainter::CompositionMode_DestinationIn

21、qsizetype sizeInBytes()

返回图像数据大小(以字节为单位)。

22、QImage transformed(const QTransform &matrix, Qt::TransformationMode mode = Qt::FastTransformation)

返回使用给定变换矩阵和变换模式变换的图像的副本。

23、QTransform trueMatrix(const QTransform &matrix, int width, int height)

返回用于转换具有给定宽度、高度和矩阵的图像的实际矩阵。

24、bool valid(const QPoint &pos)

pos 是否图像中的有效坐标。

25、QVariant operator QVariant()

将图像作为 QVariant 返回。

26、bool operator==(const QImage &image)

比较图像是否具有相同的内容。

比较可能会很慢,除非有一些明显的差异(例如不同的大小或格式)。


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

相关文章

图像处理 QImage

在Qt中有四种处理图像的方法&#xff1a; QImage &#xff1a;使用I/O &#xff0c;可以对像素进行处理QPixmap&#xff1a;主要用在屏幕的显示QBitmap&#xff1a; QPixmap的子类&#xff0c;处理颜色深度&#xff0c;只能显示黑白两种颜色&#xff0c;用于遮罩QPicture&…

QImage的用法

QImage提供了几种加载图像文件的方法&#xff1a; &#xff08;1&#xff09;构造QImage对象 Image myImage1 QImage(filename); 根据文件名打开图像 支持的图片格式是&#xff1a; &#xff08;2&#xff09;QImage(uchar *data, int width, int height, Format format …) 用…

QImage使用说明

详细描述 QImage类提供独立于硬件的图像表示&#xff0c;允许直接访问像素数据&#xff0c;并可用作绘制设备。 Qt提供了四个用于处理图像数据的类&#xff1a;QImage、QPixmap、QBitmap和QPicture。QImage针对I/O、直接像素访问和操作进行了设计和优化&#xff0c;而QPixmap…

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数据、如何记…