Qt 之 QImage

Qt 之 QImage,第1张

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 。

QImage 提供了一组函数,这些函数可用于获取有关图像的各种信息:

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

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

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

颜色表中的一项是编码为QRgb值的ARGB四联体。使用 qRgb() 和 qRgba() 函数可以为 setColor() 函数使用一个合适的 QRgb 值。例如:

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

QImage 还提供了 scanLine() 函数,该函数返回具有给定索引的扫描线处的像素数据的指针,而 bits() 函数,其返回指向第一个像素数据的指针(这等效于 scanLine(0) )。

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() 函数说明是否可以安全地将彩色图像转换为灰度图像。

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

mirrored() 函数沿所需方向返回图像的镜像, scaled() 返回按比例缩放至所需度量的矩形的图像副本, rgbSwapped() 函数根据RGB图像构造BGR图像。

scaledToWidth() 和 scaledToHeight() 函数返回图像的缩放副本。

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

构造具有给定 width , height 和 format 的图像。

如果无法分配内存,将返回 null 图像。

警告:这将创建一个具有未初始化数据的 QImage 。在使用 QPainter 绘制图像之前,调用 fill() 用适当的像素值填充图像。

构造具有给定 width , height 和 format 的图像,该图像使用现有的内存缓冲区 data 。 width , height 必须以像素为单位指定, data 必须是32位对齐的,并且图像中数据的每条扫描线也必须是32位对齐的。

缓冲区必须在 QImage 的整个生命周期内以及所有未修改或与原始缓冲区分离的副本中保持有效。映像不会删除销毁的缓冲区。您可以提供一个函数指针 cleanupFunction 以及一个额外的指针 cleanupInfo ,该指针将在销毁最后一个副本时被调用。

如果 format 是索引颜色格式,则图像颜色表最初为空,必须在使用图像之前使用 setColorCount() 或 setColorTable() 进行充分扩展。

构造具有给定宽度,高度和格式的图像,该图像使用现有的内存缓冲区 data 。宽度和高度必须以像素为单位指定。 bytesPerLine 指定每行的字节数(跨度)。

当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转) *** 作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。

下面以灰度相机为例,介绍封装方法:

第一步:首先根据相机的SDK内的读图像函数,获取图像数据imgData、宽度imgWidth和高度imHeight。

第二步:申请QImage对象,注意类型是Format_RGB32.

第三步:利用成员函数setPixel()设置QImage像素。由于相机输出的图像是灰度图像,每一位置的R、G、B分量相等且均等于当前位置的像素值。

具体程序如下:[cpp]

QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32

//RGB分量值int b = 0int g = 0int r = 0//设置像素

for (int i=0i<imgHeighti++){

for (int j=0j<imgWidthj++){

b = (int)*(imgDataNew+i*imgWidth+j);g = br = g

desImage.setPixel(j,i,qRgb(r,g,b));}}QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32

//RGB分量值int b = 0int g = 0int r = 0//设置像素

for (int i=0i<imgHeighti++){

for (int j=0j<imgWidthj++){

b = (int)*(imgDataNew+i*imgWidth+j);g = br = g

desImage.setPixel(j,i,qRgb(r,g,b));}}

对于灰度图像数据,如下封装方式是错误的。

qt提供了多个保存图片的接口,比较常用的接口如下

bool QPixmap::save ( const QString &fileName, const char * format = 0, int quality = -1 ) const

参数说明:

fileName 文件的路径

可选参数:format 图片的格式(qt目前支持的格式见下表),如果未设置该值

则根据文件路径的后缀名来判断图片的存储格式。

可选参数:quality 图片的质量(可设置成0-100之内的值,数值越大说明保存的质量越好),如果未设置该值,则按照默认的设置来保存图片。

表一:qt 4.6.3支持的文件格式

格式 描述

BMP Windows Bitmap

JPG Joint Photographic Experts Group

JPEG Joint Photographic Experts Group

PNG Portable Network Graphics

PPM Portable Pixmap

TIFF Tagged Image File Format

XBM X11 Bitmap

XPM X11 Pixmap

bool QImage::save ( const QString &fileName, const char * format = 0, int quality = -1 ) const

参数说明同上

这里举个使用QPixmap保存图片的例子:

QPixmap pixmap

if(pixmap.load("D:\\images\\source.png"))

{

if(pixmap.save("distance.jpg"))

{

//save image successful

}else

{

//save image failure

}

}else

{

//load image failure

}

注:如果需要对图片的保存参数进行更多的设置,可以使用QImageWriter提供的接口来实现


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11194558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存