ChatGPT解决这个技术问题 Extra ChatGPT

QImage 和 QPixmap 有什么区别?

我不明白 QImage 和 QPixmap 之间有什么区别,它们似乎提供了相同的功能。什么时候应该使用 QImage,什么时候应该使用 QPixmap?

我不确定我是否理解你的问题,但我认为在文档中很清楚:“QImage 是为 I/O 和直接像素访问和操作而设计和优化的,而 QPixmap 是为显示图像而设计和优化的在屏幕上。” doc.qt.nokia.com/latest/qpixmap.html#details
是的!我已经找到了,但不是很明白,例如针对I/O优化和针对显示进行了优化,这是在不同平台上显示的图片不同吗? ..你能帮我解释一下吗..谢谢..
我仍然不是 100% 确定我知道你的意思,但如果你使用 QWidgets,你可以在 QLabel 中显示它。如果你使用 QGraphicsView,你可以在 QGraphicsPixmapItem 中显示它。如果您使用 QML,Image 元素将为您处理一切。
让我换一种说法,什么是引擎,它的工作是什么?什么时候使用它?

C
Community

通过阅读 QImageQPixmap 上的文档轻松回答:

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

编辑:另外,来自@Dave的回答:

您不能在 GUI 线程之外操作 QPixmap,但 QImage 没有这样的限制。

来自@Arnold:

这是一个通常(并非总是)适用的简短摘要:如果您打算操作图像、修改图像、更改图像上的像素等,请使用 QImage。如果您计划在屏幕上多次绘制同一图像,请将其转换为 QPixmap。


谢谢你的帮助...... QPixmpa 和 QImage 加载图片的一般过程是什么......它在内存中是什么......谢谢......
我不确定您要做什么,但在this question中,我演示了如何从磁盘加载 YV12 数据,使用 GLSL 片段着色器转换为 RGB,然后将其显示在 QImage 内的屏幕上。如果您更清楚自己要完成的工作,我想我可以为您指明正确的方向。
这真的回答了什么吗?
仅仅复制文档和其他人的答案是没有意义的。
I
Innokentiy Alaytsev

Qt Labs 有一系列很好的文章,解释了很多关于 Qt 图形系统的内容。 This article 特别有一个关于 QImageQPixmap 的部分。

以下是通常(并非总是)适用的简短摘要:

如果您打算操作图像、修改图像、更改图像上的像素等,请使用 QImage。

如果您计划在屏幕上多次绘制同一图像,请将其转换为 QPixmap。


谢谢你。这段话告诉我们:加载图片有两种不同的方式,光栅和OpenGL?是正确的?
我不太明白这个问题。 “光栅”和“OpenGL”都不是专门代表加载图片的方式。
QImage 的“操作和修改”是否包括将其保存为图像文件?如果我从 QImage 对象开始,将其保存为图像文件时哪个更快?
D
Dave Mateer

一个重要的区别是您不能在除主 GUI 线程之外的任何东西上创建或操作 QPixmap。但是,您可以在后台线程上创建和操作 QImage 实例,然后在将它们传递回 GUI 线程后对其进行转换。


M
Mohammad Kanan

QPixmap 是一个“图像对象”,其像素表示在您的代码中无关紧要,因此 QPixmap 是为在显示屏上渲染图像而设计和优化的,它在使用 X11 时存储在 XServer 上,因此在 XWindow 上绘制 QPixmap 比绘制 QImages,因为数据已经在服务器上,并且可以使用。何时使用 QPixmap:如果您只想反复绘制现有图像(图标 .. 背景 .. 等),请使用 QPixmap。

QImage 是客户端代码的“内存中的像素阵列”,QImage 针对 I/O 以及直接像素访问和操作而设计和优化。何时使用QImage:如果你想绘制,用Qpaint,或者操作一个图像的像素。

QBitmap 只是一个方便的 QPixmap 子类,确保深度为 1,它是一个单色(1 位深度)像素图。就像 QPixmap 一样,QBitmap 针对隐式数据共享的使用进行了优化。

QPicture 是一个绘图设备,可以记录和回放 QPainter 命令——你的绘图——


i
iksess

在工业环境中很重要:

QPixmap 存储在进行显示的视频卡上。不是 QImage。

因此,如果您有一个运行应用程序的服务器,以及一个执行显示的客户端站,那么就网络使用而言,这是非常重要的。

使用 Pixmap,重绘包括通过网络仅发送重绘命令(几个字节)。

使用 QImage,它包括发送整个图像(大约几 MB)。


“使用 Pixmap,重绘只包括通过网络发送重绘(几个字节)的命令。”.. 这是误导性的。显存也有限,没有数据怎么办?
@Nawaz:当然,图像必须通过网络至少发送一次,而且内存是有限的。但只要它在显存中(我想只要它显示出来),就会执行重绘命令而不重新发送它。例如,当在图像前面绘制某些东西时。我们在我们的网络数据流上观察到了这一点。在 2012 年!...:P