Qual è la differenza tra QImage e QPixmap?


85

Non capisco quale sia la differenza tra QImage e QPixmap, sembrano offrire la stessa funzionalità. Quando dovrei usare una QImage e quando dovrei usare una QPixmap?


Non sono sicuro di aver capito la tua domanda, ma ho pensato che fosse abbastanza chiaro nella documentazione: "QImage è progettato e ottimizzato per I / O e per l'accesso e la manipolazione diretti dei pixel, mentre QPixmap è progettato e ottimizzato per mostrare le immagini sullo schermo." doc.qt.nokia.com/latest/qpixmap.html#details
cgmb

1
si! L'avevo scoperto, ma non ho capito bene, ad esempio, ottimizzato per I / O e ottimizzato per la visualizzazione, è differenza una foto mostrata sulla piattaforma di differenza? ..Puoi aiutarmi a spiegare .. grazie ..
Mr.Tu

Non sono ancora sicuro al 100% di sapere cosa intendi, ma se stai usando QWidgets, puoi visualizzarlo in una QLabel. Se stai usando QGraphicsView, puoi visualizzarlo in un QGraphicsPixmapItem. Se stai usando QML, l'elemento Image gestirà tutto per te.
cgmb

Mettiamola in un altro modo, cos'è il motore, qual è il suo lavoro? quando usarlo?
Mr.Tu

Risposte:


55

Risposte facilmente leggendo i documenti su QImage e QPixmap :

La classe QPixmap è una rappresentazione dell'immagine fuori schermo che può essere utilizzata come dispositivo di disegno.

La classe QImage fornisce una rappresentazione dell'immagine indipendente dall'hardware che consente l'accesso diretto ai dati dei pixel e può essere utilizzata come dispositivo di disegno.

Modifica: inoltre, dalla risposta di @ Dave:

Non puoi manipolare una QPixmap al di fuori del thread della GUI, ma QImage non ha tale restrizione.

E da @Arnold:

Ecco un breve riassunto che di solito (non sempre) si applica:

  • Se prevedi di manipolare un'immagine, modificarla, cambiare i pixel su di essa, ecc., Usa una QImage.
  • Se prevedi di disegnare la stessa immagine più di una volta sullo schermo, convertila in una QPixmap.

grazie per il vostro aiuto ... qual è il processo generale con cui QPixmpa e QImage caricano un'immagine .. cosa c'è in memoria .. grazie ..
Mr.Tu

Non sono sicuro di cosa stai cercando di fare, ma in questa domanda dimostro come caricare i dati YV12 dal disco, convertirli in RGB usando uno shader di frammento GLSL e quindi visualizzarli sullo schermo all'interno di una QImage. Immagino che potrei indicarti la giusta direzione se fossi più chiaro su ciò che stai cercando di ottenere.
karlphillip

16
Questo risponde davvero a qualcosa?
semisicura

7
Copiare la documentazione e le risposte degli altri non ha senso.
Viacheslav Kroilov

48

C'è una bella serie di articoli su Qt Labs che spiega molto sul sistema grafico Qt. In questo articolo , in particolare, ha una sezione sulla QImagevs. QPixmap.

Ecco un breve riassunto che di solito (non sempre) si applica:

  • Se prevedi di manipolare un'immagine, modificarla, cambiare i pixel su di essa, ecc., Usa un file QImage.
  • Se prevedi di disegnare la stessa immagine più di una volta sullo schermo, convertila in un file QPixmap.

grazie. Questo passaggio ci dice: ci sono due modi diversi per caricare un'immagine, raster e OpenGL? è giusto?
Mr.Tu

Non capisco bene la domanda. Né "raster" né "OpenGL" rappresentano specificamente modi per caricare un'immagine.
Arnold Spence

37

Una differenza importante è che non è possibile creare o manipolare un QPixmapsu nient'altro che il thread principale della GUI. È tuttavia possibile creare e manipolare QImageistanze sui thread in background e quindi convertirle dopo averle restituite al thread della GUI.


22

Importante negli ambienti industriali:

La QPixmap viene memorizzata sulla scheda video durante la visualizzazione. Non il QImage.

Quindi, se hai un server che esegue l'applicazione e una stazione client che esegue la visualizzazione, è molto significativo in termini di utilizzo della rete.

Con una Pixmap, un Redraw consiste nell'inviare solo l'ordine di redraw (pochi byte) sulla rete.

Con una QImage, consiste nell'inviare l'intera immagine (circa pochi MB).


19
  • QPixmap è un "oggetto immagine" la cui pixelrappresentazione non ha alcuna conseguenza nel codice, quindi QPixmap è progettato e ottimizzato per il rendering di immagini sullo schermo, viene memorizzato su XServer quando si utilizza X11, quindi disegnare QPixmap su XWindow è molto più veloce del disegno QImages, poiché i dati sono già sul server e pronti per l'uso.

    Quando usare QPixmap : Se vuoi solo disegnare un'immagine esistente (icona .. sfondo .. ecc.) Specialmente ripetutamente, allora usa QPixmap.

  • QImage è un "array di pixel in memoria" del codice client , QImage è progettato e ottimizzato per I / O e per l'accesso e la manipolazione diretti ai pixel.

    Quando usare QImage : se vuoi disegnare, con Qpaint, o manipolare i pixel di un'immagine.

  • QBitmap è solo una comoda sottoclasse QPixmap che garantisce una profondità di 1, è una pixmap monocromatica (profondità di 1 bit). Proprio come QPixmap, QBitmap è ottimizzato per l'uso della condivisione implicita dei dati.

  • QPicture è un dispositivo di disegno che registra e riproduce i comandi QPainter - il tuo disegno -
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.