QImage 简介
QImage
类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘图设备。因为QImage
是QPaintDevice
子类,所以可以使用QPainter
直接在图像上绘制。在QImage
上使用QPainter
时,可以在当前 GUI 线程以外的其他线程中执行绘制。
QImage
类支持 Format
枚举描述的几种图像格式。这些包括单色,8 位,32 位和 alpha 混合图像,可在所有 Qt 4.x 版本中使用。
QImage
提供了一组函数,这些函数可用于获取有关图像的各种信息。还有一些函数可以实现图像变换。由于QImage
类使用implicit data sharing,因此可以按值传递QImage
对象。 QImage对象也可以流式传输和比较。
读取和写入图片的操作与 QPixmap
相同。具体参考 Qt 之 QPixmap。
Image 信息
QImage
提供了一组函数,这些函数可用于获取有关图像的各种信息:
![](https://img.haomeiwen.com/i1114626/ab9dd6ff47024b12.png)
Pixel Manipulation
用于处理图像像素的函数取决于图像格式。原因是单色和 8 位图像基于索引并使用颜色查找表,而 32 位图像直接存储 ARGB 值。有关图像格式的更多信息,请参见Image Formats
部分。
对于32位图像,可以使用setPixel()
函数将给定坐标处的像素颜色更改为指定为 ARGB 四联体的任何其他颜色。要生成合适的 QRgb 值,请使用qRgb()
(向给定的 RGB 值添加默认的 alpha 分量,即创建不透明的颜色)或 qRgba()
函数。 例如:
![](https://img.haomeiwen.com/i1114626/9cf1042f3e067f9b.png)
如果是8位和单色图像,则像素值只是图像颜色表中的索引。因此,setPixel()
函数只能用于将给定坐标处的像素颜色更改为图像颜色表中的预定义颜色,即只能更改像素的索引值。要将颜色更改或添加到图像的颜色表中,请使用setColor()
函数。
颜色表中的一项是编码为QRgb值的ARGB四联体。使用qRgb()
和qRgba()
函数可以为setColor()
函数使用一个合适的QRgb
值。例如:
![](https://img.haomeiwen.com/i1114626/edd5692330530ffc.png)
对于每个颜色通道超过8位的图像。setPixelColor()
和pixelColor()
方法可用于设置和获取QColor
值。
QImage
还提供了scanLine()
函数,该函数返回具有给定索引的扫描线处的像素数据的指针,而bits()
函数,其返回指向第一个像素数据的指针(这等效于scanLine(0)
)。
Image Formats
QImage
中存储的每个像素都由整数表示。整数的大小取决于格式。QImage
支持Format
枚举描述的几种图像格式。
单色图像使用1位索引存储到最多具有两种颜色的颜色表中。单色图像有两种不同类型:大字节序(MSB优先)或小字节序(LSB优先)。
8位图像使用 8 位索引存储到颜色表中,即每个像素只有一个字节。颜色表是QVector<QRgb>
,QRgb typedef
等效于一个无符号整数,其中包含格式为 0xAARRGGBB
的 ARGB 四元组。
32位图像没有颜色表;相反,每个像素都包含一个QRgb值。分别存储RGB(即0xffRRGGBB),ARGB和预乘ARGB值的三种不同类型的32位图像。在预乘格式中,红色,绿色和蓝色通道乘以除以255的alpha分量。
可以使用format()
函数检索图像的格式。使用convertToFormat()
函数可将图像转换为另一种格式。allGray()
和isGrayscale()
函数说明是否可以安全地将彩色图像转换为灰度图像。
Image Transformations
QImage支持许多用于创建新图像的功能,该图像是原始图像的转换版本:createAlphaMask()
函数从该图像的alpha缓冲区生成并返回一个1-bpp蒙版,而createHeuristicMask()
函数创建并返回此图像的1-bpp启发式蒙版。后一种功能的工作方式是从一个角中选择一种颜色,然后从所有边缘开始切去该颜色的像素。
mirrored()
函数沿所需方向返回图像的镜像,scaled()
返回按比例缩放至所需度量的矩形的图像副本,rgbSwapped()
函数根据RGB图像构造BGR图像。
scaledToWidth()
和scaledToHeight()
函数返回图像的缩放副本。
transformd()
函数返回使用给定的转换矩阵和转换模式转换的图像的副本:在内部,调整转换矩阵以补偿不必要的平移,即transform()
返回包含图像所有转换点的最小图像。原始图像。静态trueMatrix()
函数返回用于转换图像的实际矩阵。
![](https://img.haomeiwen.com/i1114626/1ec2a8ad8fe1a176.png)
QImage 使用
![](https://img.haomeiwen.com/i1114626/80420fddb7f0b484.png)
构造具有给定 width
, height
和 format
的图像。
如果无法分配内存,将返回null
图像。
警告:这将创建一个具有未初始化数据的 QImage
。在使用QPainter
绘制图像之前,调用fill()
用适当的像素值填充图像。
构造具有给定 width
, height
和 format
的图像,该图像使用现有的内存缓冲区data
。width
, height
必须以像素为单位指定,data
必须是32位对齐的,并且图像中数据的每条扫描线也必须是32位对齐的。
缓冲区必须在QImage
的整个生命周期内以及所有未修改或与原始缓冲区分离的副本中保持有效。映像不会删除销毁的缓冲区。您可以提供一个函数指针cleanupFunction
以及一个额外的指针cleanupInfo
,该指针将在销毁最后一个副本时被调用。
如果format
是索引颜色格式,则图像颜色表最初为空,必须在使用图像之前使用setColorCount()
或setColorTable()
进行充分扩展。
构造具有给定宽度,高度和格式的图像,该图像使用现有的内存缓冲区data
。宽度和高度必须以像素为单位指定。 bytesPerLine
指定每行的字节数(跨度)。
网友评论