QImage和QPixmap有什么区别?

102

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


我不确定我是否理解了你的问题,但我认为文档已经非常清楚了:“QImage被设计和优化用于I/O,以及直接像素访问和操作,而QPixmap则被设计和优化用于在屏幕上显示图像。”http://doc.qt.nokia.com/latest/qpixmap.html#details - cgmb
1
是的!我已经找到了,但是还不太理解,例如,针对I/O进行优化和针对显示进行优化,这是不是意味着在不同平台上显示的图片会有所不同?..你能帮我解释一下吗?谢谢。 - Mr.Tu
我仍然不确定我是否完全理解你的意思,但是如果你正在使用QWidgets,你可以在QLabel中显示它。如果你正在使用QGraphicsView,你可以在QGraphicsPixmapItem中显示它。如果你正在使用QML,那么Image元素将为你处理一切。 - cgmb
让我换个方式来说,什么是引擎,它的工作是什么?何时使用它? - Mr.Tu
5个回答

66

通过阅读 QImageQPixmap 的文档,很容易得到答案:

QPixmap 类是一个可以用作绘画设备的 离屏 图像表示。

QImage 类提供了硬件无关的图像表示,允许直接访问像素数据,并可用作绘画设备。

编辑:此外,来自 @Dave 的答案:

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

来自 @Arnold 的答案:

以下是通常(但不总是)适用的简短总结:

  • 如果计划对图像进行操纵、修改、更改像素等操作,请使用 QImage。
  • 如果计划在屏幕上多次绘制相同的图像,请将其转换为 QPixmap。

感谢您的帮助... QPixmpa和QImage加载图像的一般流程是什么.. 它在内存中是什么.. 谢谢。 - Mr.Tu
我不确定你想做什么,但在这个问题中,我展示了如何从磁盘加载YV12数据,使用GLSL片段着色器将其转换为RGB,然后在QImage内显示在屏幕上。如果你更清楚你想要实现什么,我想我可以指引你正确的方向。 - karlphillip
23
这真的有回答到任何问题吗? - spinkus
9
仅仅复制文档和他人的答案是没有意义的。 - Viacheslav Kroilov

54

在Qt实验室有一系列很好的文章,介绍了很多关于Qt图形系统的知识。这篇文章特别讲解了QImageQPixmap之间的区别。

以下是一个通常(不总是)适用的简短总结:

  • 如果您计划操作图像,修改它,更改其上的像素等,请使用QImage
  • 如果您计划在屏幕上多次绘制同一图像,请将其转换为QPixmap

这段内容告诉我们:加载图片有两种不同的方式,栅格和OpenGL?是这样吗?谢谢。 - Mr.Tu
我不太明白这个问题。无论是“光栅”还是“OpenGL”,都不能具体代表加载图片的方式。 - Arnold Spence
QImage 的“操作和修改”是否包括将其保存为图像文件?如果我从 QImage 对象开始,将其保存为图像文件时哪个更快? - reddy

38

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


24

在工业环境中非常重要:

QPixmap 存储在负责显示的视频卡上,而不是 QImage。

因此,如果您有一个运行应用程序的服务器和一个用于显示的客户端工作站,则在网络使用方面非常重要。

使用 Pixmap,重新绘制只需要通过网络发送重新绘制的指令(几个字节)。

使用 QImage,需要发送整个图像(大约几 MB)来重新绘制。


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

24
  • QPixmap 是一个“图像对象”,其pixel表示在您的代码中并不重要,因此QPixmap被设计和优化用于在显示屏上渲染图像,当使用X11时,它存储在XServer上,因此在XWindow上绘制QPixmap比绘制QImage要快得多,因为数据已经在服务器上,准备好使用。

    何时使用QPixmap:如果只想绘制现有图像(图标..背景..等等),尤其是重复使用,则使用QPixmap。

  • QImage 是客户端代码中的“像素数组”,QImage被设计和优化用于I/O以及直接像素访问和操作。

    何时使用QImage:如果要使用Qpaint绘制或操作图像像素。

  • QBitmap 只是一个方便的QPixmap子类,确保深度为1,它是单色(1位深度)Pixmap。就像QPixmap一样,QBitmap也被优化为使用隐式数据共享。

  • QPicture 是一个绘画设备,可以记录和重放QPainter命令——即您的绘画操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接