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 指定每行的字节数(跨度)。

1、如果你是从文件读,

那么直接用QImage或QPixmap的带有文件路径的构造函数构造一个对象,

然后用QLabel的setPixmap

2、如果你的图像已经存在内存中,你只是想进行如ARGB转换成灰度或是2值图像的话,

那么你可以用QImage的成员函数convertToFormat进行转换

其中第一个参数是一个枚举类型,表示的是你的图像类型哪槐,如8位的灰度类型或是RGB类型等

文档解释的很清楚,可以自己看。

*注意一点就是QImage可以转换成QPimap,转换是很快的,浅引用里面的ImageData而已,详细内容你可以看源码,于是你就可以通过QLabel的setPixmap进行显示了

3、如果你是想通过字节自己变化,

那就直接通过QImage或是QPixmap的scanLine获取起始的字节指针

然后根据图像的宽度进行遍历就是,关于RGB和灰度转换的算法或是根据阈值转换2值图像的算法有很多,自己去研究吧。最后将你处理的设置到QLabel就行了

一点建议:如果你真要在Qt上做一些图像算子处理什么的,别用QLabel,QLabel是轻量级的,你最好是用GraphicsView-Scene-item这个去做

补充的问题回答:

你颜色空间都不一样,那就不能直接读了,你可以先将YUV的颜色空间转换成Rgb24的,Qt只支持HSV,HSL,CMYK,RGB这四种颜色空间。。

所以你自己先将该图像的字节流数据用文件流的方式读,然后根据颜色空间转换的算法转换成RGB24,然后可以根据你转换后的整个字节数组获得一个QImage或是QPixmap

继续补充:二值图就是1个像素是1位,不是很清楚你问的问题“或歼如何知道二值图是24位或8位”,你能描述清楚点么,你要是不懂图像处理李团友,就搞个PPT或是书研究下基础吧。

你要是有什么问题可以HI我…

1、一个简单的图片显示程序(以下仅是部分程序段,相信大家会看明白)

QPixmap pixmap( "image.jpg" ) //image.jpg在程序的当前目录下。

PixmapLabel1->setPixmap(pixmap) //PixmapLabel1标签即可显示图片。

2、将QImage转换为QPixmap

QString fileName = QFileDialog::getOpenFileName(this,

tr("Open File"), QDir::currentPath())

if (!fileName.isEmpty())

{

QImage image(fileName) //定义QImage类。

if (image.isNull()) {

QMessageBox::information(this, tr("Image Viewer"),

tr("Cannot load %1.").arg(fileName))

return

}

ui.label->setPixmap(QPixmap::fromImage(image)) 将QImage转换为QPixmap。

}

3、QImage的加载图片的方法(个人现只懂两种)

(1)、QImage image(fileName) //直接在QImage类的构造函数搞定,fileName是指应用程序的当前目录,相信大家能理解这饥陵里所说的当前目录。

(2)烂局戚、腊颤QImage image

image.load(fileName) //使用了load方法。


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

原文地址: https://outofmemory.cn/bake/11991507.html

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

发表评论

登录后才能评论

评论列表(0条)

保存