【问题标题】:What is the difference between QImage and QPixmap?QImage 和 QPixmap 有什么区别?
【发布时间】:2012-05-05 16:14:54
【问题描述】:

我不明白 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 元素将为您处理一切。
  • 换个说法,Engine是什么,它的工作是什么?什么时候用?

标签: c++ qt qimage qpixmap


【解决方案1】:

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

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

  • 如果您打算对图像进行操作、修改、更改像素等操作,请使用QImage
  • 如果您打算在屏幕上多次绘制同一图像,请将其转换为 QPixmap

【讨论】:

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

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

【讨论】:

    【解决方案3】:

    阅读QImageQPixmap 上的文档即可轻松回答:

    QPixmap 类是一种离屏图像表示,可用作绘画设备。

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

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

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

    来自@Arnold:

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

    • 如果您打算处理图像,修改它,改变它的像素, 等等,使用 QImage。
    • 如果您打算多次绘制同一图像 在屏幕上,将其转换为 QPixmap。

    【讨论】:

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

    在工业环境中很重要:

    QPixmap 存储在用于显示的视频卡上。不是 QImage。

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

    对于像素图,重绘包括仅通过网络发送重绘的顺序(几个字节)。

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

    【讨论】:

    • “使用 Pixmap,重绘只包括通过网络发送重绘(几个字节)的顺序。”.. 这是误导。显存也有限,没有数据怎么办?
    • @Nawaz:当然,图像至少要通过网络发送一次,而且内存是有限的。但只要它在显存中(我想只要它显示出来),重绘命令就会被执行而无需重新发送。例如,当在图像前面绘制某些东西时。我们在我们的网络数据流上观察到了这一点。 2012 年!...:P
    【解决方案5】:
    • QPixmap 是一个“图像对象”,其pixel 表示在您的代码中无关紧要,因此 QPixmap 为在显示屏上呈现图像而设计和优化,它在使用 X11 时存储在 XServer 上,因此在 XWindow 上绘制 QPixmap比绘制 QImages 快得多,因为数据已经在服务器上,可以使用了。

      何时使用 QPixmap:如果您只想反复绘制现有图像(图标 .. 背景 .. 等),请使用 QPixmap。

    • QImage客户端 代码的“内存中的像素数组”,QImage 专为 I/O 以及直接像素访问和操作而设计和优化。

      何时使用 QImage:如果你想绘制,使用 Qpaint,或者操作图像像素。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2021-05-14
      • 2012-04-13
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      相关资源
      最近更新 更多