¿Cuál es la diferencia entre QImage y QPixmap?

84

No entiendo cuál es la diferencia entre QImage y QPixmap, parecen ofrecer la misma funcionalidad. ¿Cuándo debo usar un QImage y cuándo debo usar un QPixmap?

Señor tu
fuente
No estoy seguro de haber entendido su pregunta, pero pensé que estaba bastante claro en la documentación: "QImage está diseñado y optimizado para E / S, y para acceso directo y manipulación de píxeles, mientras que QPixmap está diseñado y optimizado para mostrar imágenes en la pantalla." doc.qt.nokia.com/latest/qpixmap.html#details
cgmb
1
¡Si! Lo había averiguado, pero no lo entendía bien, por ejemplo, optimizado para E / S y optimizado para mostrar, ¿es la diferencia una imagen mostrada en la plataforma diferente? ..Puedes ayudarme a dar un paso para explicar .. gracias ..
Mr.Tu
Todavía no estoy 100% seguro de saber a qué te refieres, pero si estás usando QWidgets, puedes mostrarlo en una QLabel. Si está utilizando QGraphicsView, puede mostrarlo en un QGraphicsPixmapItem. Si está utilizando QML, el elemento Image se encargará de todo por usted.
cgmb
Permítanme decirlo de otra manera, ¿qué es el motor, cuál es su trabajo? cuando usarlo?
Mr.Tu

Respuestas:

55

Fácilmente respondió leyendo los documentos en QImage y QPixmap :

El QPixmap clase es una representación de imagen fuera de la pantalla que se puede utilizar como dispositivo de pintura.

La clase QImage proporciona una representación de imagen independiente del hardware que permite el acceso directo a los datos de píxeles y se puede utilizar como dispositivo de pintura.

Editar: Además, de la respuesta de @ Dave:

No puede manipular un QPixmap fuera del hilo de la GUI, pero QImage no tiene tal restricción.

Y de @Arnold:

Aquí hay un breve resumen que generalmente (no siempre) se aplica:

  • Si planea manipular una imagen, modificarla, cambiar píxeles en ella, etc., use una QImage.
  • Si planea dibujar la misma imagen más de una vez en la pantalla, conviértala en un QPixmap.
karlphillip
fuente
gracias por su ayuda ... cual es el proceso general que QPixmpa y QImage cargan una imagen .. que hay en la memoria .. gracias ..
Mr.Tu
No estoy seguro de lo que está tratando de hacer, pero en esta pregunta demuestro cómo cargar datos YV12 desde el disco, convertirlos a RGB usando un sombreador de fragmentos GLSL y luego mostrarlos en la pantalla dentro de una QImage. Supongo que podría indicarle la dirección correcta si tuviera más claro lo que está tratando de lograr.
karlphillip
14
¿Esto realmente responde a algo?
spinkus
7
Simplemente copiar documentación y las respuestas de otros no tiene sentido.
Viacheslav Kroilov
48

Hay una buena serie de artículos en Qt Labs que explican mucho sobre el sistema de gráficos Qt. Este artículo en particular tiene una sección sobre QImagevs.QPixmap .

Aquí hay un breve resumen que generalmente (no siempre) se aplica:

  • Si planea manipular una imagen, modificarla, cambiar píxeles en ella, etc., use un QImage .
  • Si planea dibujar la misma imagen más de una vez en la pantalla, conviértala a QPixmap.
Arnold Spence
fuente
gracias. Este pasaje nos dice: ¿hay dos formas diferentes de cargar una imagen, raster y OpenGL? ¿es correcto?
Mr.Tu
No entiendo bien la pregunta. Ni "raster" ni "OpenGL" representan específicamente formas de cargar una imagen.
Arnold Spence
37

Una diferencia importante es que no puede crear ni manipular un QPixmapen nada más que en el hilo principal de la GUI. Sin embargo, puede crear y manipular QImageinstancias en subprocesos en segundo plano y luego convertirlas después de devolverlas al subproceso de la GUI.

Dave Mateer
fuente
22

Importante en entornos industriales:

El QPixmap se almacena en la tarjeta de video que realiza la visualización. No la QImage.

Entonces, si tiene un servidor que ejecuta la aplicación y una estación de cliente que realiza la visualización, es muy importante en términos de uso de la red.

Con un Pixmap, un Redraw consiste en enviar solo la orden de redibujar (unos pocos bytes) por la red.

Con una QImage, consiste en enviar la imagen completa (unos pocos MB).

iksess
fuente
19
  • QPixmap es un "objeto de imagen" cuya pixelrepresentación no tiene importancia en su código. Por lo tanto, QPixmap está diseñado y optimizado para representar imágenes en la pantalla de visualización, se almacena en el XServer cuando se usa X11, por lo que dibujar QPixmap en XWindow es mucho más rápido que dibujar QImages, ya que los datos ya están en el servidor y listos para usar.

    Cuándo usar QPixmap : si solo desea dibujar una imagen existente (icono, fondo, etc.) especialmente repetidamente, use QPixmap.

  • QImage es una "matriz de píxeles en la memoria" del código del cliente , QImage está diseñado y optimizado para E / S y para el acceso directo y la manipulación de píxeles.

    Cuándo usar QImage : si desea dibujar, con Qpaint, o manipular los píxeles de una imagen.

  • QBitmap es solo una subclase conveniente de QPixmap que garantiza una profundidad de 1, es un mapa de píxeles monocromo (profundidad de 1 bit). Al igual que QPixmap, QBitmap está optimizado para el uso de intercambio de datos implícito.

  • QPicture es un dispositivo de pintura que registra y reproduce los comandos de QPainter - su dibujo -
Mohammad Kanan
fuente