C++ QImage和QPixmap之间有什么区别?

C++ QImage和QPixmap之间有什么区别?,c++,qt,qimage,qpixmap,C++,Qt,Qimage,Qpixmap,我不明白QImage和QPixmap之间有什么区别,它们似乎提供了相同的功能。我什么时候应该使用QImage,什么时候应该使用QPixmap?Qt实验室有一系列很好的文章,解释了很多关于Qt图形系统的内容。特别是关于QImage与QPixmap的章节 以下是一个通常(并非总是)适用的简短总结: 如果您计划操作图像、修改图像、更改图像上的像素等,请使用QImage 如果计划在屏幕上多次绘制同一图像,请将其转换为QPixmap 一个重要的区别是,除了主GUI线程之外,您不能在任何东西上创建或操作Q

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

Qt实验室有一系列很好的文章,解释了很多关于Qt图形系统的内容。特别是关于
QImage
QPixmap
的章节

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

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

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

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

QPixmap类是一种屏幕外图像表示,可以用作绘制设备

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

编辑:还有@Dave的答案:

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

来自@Arnold:

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

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

在工业环境中很重要:

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

因此,如果您有一个运行应用程序的服务器和一个执行显示的客户端站,这对于网络使用来说是非常重要的

对于Pixmap,重画只包括通过网络发送重画命令(几个字节)

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

  • QPixmap 是一个“图像对象”,其
    像素
    表示在您的代码中无关紧要,因此QPixmap是为在显示屏上渲染图像而设计和优化的,当使用X11时,它存储在XServer上,因此在XWindow上绘制QPixmap比绘制QImages要快得多,因为数据已经在服务器上,并且可以随时使用

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

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

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

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

  • QPicture是一种绘画设备,用于记录和重放QPainter命令--您的绘画--

我不确定是否理解您的问题,但我认为文档中的内容非常清楚:“QImage是为I/O和直接像素访问和操作而设计和优化的,而QPixmap是为在屏幕上显示图像而设计和优化的。”是的!我已经找到了,但不太明白,例如,优化i/O和优化显示,这是不同平台上显示的图片的差异吗。。你能帮我解释一下吗。。谢谢。我仍然不能100%确定我知道你的意思,但是如果你使用QWidgets,你可以在QLabel中显示它。如果您使用的是QGraphicsView,则可以在QGraphicsPixmapItem中显示它。如果您使用的是QML,那么Image元素将为您处理所有事情。换言之,引擎是什么,它的工作原理是什么?什么时候使用?谢谢你的帮助。。。QPixmpa和QImage加载图片的一般过程是什么。。记忆中是什么。。谢谢..我不确定您想做什么,但在中,我演示了如何从磁盘加载YV12数据,使用GLSL片段着色器转换为RGB,然后将其显示在QImage内的屏幕上。我想,如果你对自己的目标更加清楚,我可以为你指出正确的方向。这真的能回答什么问题吗?仅仅复制文档和其他人的答案是没有意义的。谢谢。这篇文章告诉我们:有两种不同的方式加载图片,光栅和OpenGL?是吗?我不太明白这个问题。“光栅”和“OpenGL”都不是专门表示加载图片的方式。“对于Pixmap,重画只包括通过网络发送重画顺序(几个字节)。”。。这是误导。视频内存也有限,如果没有数据怎么办?@Nawaz:当然,图像必须通过网络至少发送一次,而且内存有限。但只要它在视频内存中(我想只要它被显示),重画命令就可以执行,而无需重新发送。例如,当在图像前面绘制某物时。我们观察到,在我们的网络数据流上。2012年P