Jaka jest różnica między QImage a QPixmap?

84

Nie rozumiem, jaka jest różnica między QImage i QPixmap, wydaje się, że oferują tę samą funkcjonalność. Kiedy należy używać QImage, a kiedy QPixmap?

Panie Tu
źródło
Nie jestem pewien, czy rozumiem Twoje pytanie, ale pomyślałem, że w dokumentacji było to całkiem jasne: „QImage jest zaprojektowany i zoptymalizowany pod kątem operacji wejścia / wyjścia oraz bezpośredniego dostępu do pikseli i manipulacji nimi, podczas gdy QPixmap jest zaprojektowany i zoptymalizowany pod kątem wyświetlania obrazów na ekranie." doc.qt.nokia.com/latest/qpixmap.html#details
cgmb
1
Tak! dowiedziałem się, ale nie rozumiem dobrze, na przykład zoptymalizowany pod kątem I / O i zoptymalizowany do wyświetlania, czy różnica jest pokazana na platformie różnicy? ..Czy możesz mi pomóc zrobić krok do wyjaśnienia .. dziękuję ..
Pan Tu
Nadal nie jestem w 100% pewien, czy wiem, co masz na myśli, ale jeśli używasz QWidgets, możesz wyświetlić go w QLabel. Jeśli używasz QGraphicsView, możesz wyświetlić go w QGraphicsPixmapItem. Jeśli używasz QML, element Image załatwi wszystko za Ciebie.
cgmb
Powiem inaczej, czym jest silnik, na czym polega jego praca? kiedy go używać?
Pan Tu

Odpowiedzi:

55

Łatwo odpowiedział, czytając dokumenty w QImage i QPixmap :

QPixmap klasa jest off-screen reprezentacja obrazu, który może być używany jako urządzenie do malowania.

QImage klasa zapewnia sprzętową niezależną reprezentację obrazu, która pozwala na bezpośredni dostęp do danych pikseli i może być używany jako urządzenie do malowania.

Edycja: Również z odpowiedzi @ Dave:

Nie możesz manipulować mapą QPixmap poza wątkiem GUI, ale QImage nie ma takiego ograniczenia.

A od @Arnold:

Oto krótkie podsumowanie, które zwykle (nie zawsze) ma zastosowanie:

  • Jeśli planujesz manipulować obrazem, modyfikować go, zmieniać piksele itp., Użyj QImage.
  • Jeśli planujesz narysować ten sam obraz na ekranie więcej niż raz, przekonwertuj go na QPixmap.
karlphillip
źródło
dzięki za pomoc ... jaki jest ogólny proces ładowania obrazu przez QPixmpa i QImage ... co jest w pamięci ... dziękuję ...
Mr.Tu
Nie jestem pewien, co próbujesz zrobić, ale w tym pytaniu pokazuję, jak załadować dane YV12 z dysku, przekonwertować na RGB za pomocą shadera fragmentów GLSL, a następnie wyświetlić je na ekranie w QImage. Myślę, że mógłbym wskazać ci właściwy kierunek, gdybyś miał większą jasność co do tego, co próbujesz osiągnąć.
karlphillip
14
Czy to naprawdę coś odpowiada?
spinkus
7
Samo kopiowanie dokumentacji i odpowiedzi innych osób nie ma sensu.
Viacheslav Kroilov
48

W Qt Labs jest fajna seria artykułów, które wiele wyjaśniają o systemie graficznym Qt. Ten artykuł ma zwłaszcza rozdział poświęcony QImagevs. QPixmap.

Oto krótkie podsumowanie, które zwykle (nie zawsze) ma zastosowanie:

  • Jeśli planujesz manipulować obrazem, modyfikować go, zmieniać piksele itp., Użyj pliku QImage.
  • Jeśli planujesz narysować ten sam obraz więcej niż jeden raz na ekranie, przekonwertuj go na plik QPixmap.
Arnold Spence
źródło
Dziękuję Ci. Ten fragment mówi nam: są dwa różne sposoby ładowania obrazu: raster i OpenGL? jest w porządku?
Pan Tu
Nie do końca rozumiem pytanie. Ani „raster”, ani „OpenGL” nie reprezentują konkretnie sposobów ładowania obrazu.
Arnold Spence,
37

Jedną ważną różnicą jest to, że nie można tworzyć ani modyfikować QPixmapniczego poza głównym wątkiem GUI. Można jednak tworzyć QImageinstancje w wątkach w tle i manipulować nimi, a następnie konwertować je po przekazaniu z powrotem do wątku GUI.

Dave Mateer
źródło
22

Ważne w środowiskach przemysłowych:

QPixmap jest przechowywana na karcie graficznej wykonującej wyświetlanie. Nie QImage.

Więc jeśli masz serwer z uruchomioną aplikacją i stację kliencką wykonującą wyświetlanie, jest to bardzo istotne z punktu widzenia wykorzystania sieci.

W przypadku Pixmapy przerysowanie polega na wysłaniu przez sieć tylko polecenia przerysowania (kilka bajtów).

W przypadku QImage polega na przesłaniu całego obrazu (około kilku MB).

iksess
źródło
19
  • QPixmap jest "obiektem obrazu", którego pixelreprezentacja nie ma żadnego znaczenia w kodzie. Dlatego QPixmap jest zaprojektowany i zoptymalizowany do renderowania obrazów na ekranie, jest przechowywany na serwerze XServer podczas używania X11, dzięki czemu rysowanie QPixmap w XWindow jest znacznie szybsze niż rysowanie QImages, ponieważ dane są już na serwerze i gotowe do użycia.

    Kiedy używać QPixmap : Jeśli chcesz tylko wielokrotnie rysować istniejący obraz (ikona… tło… itd.), Użyj QPixmap.

  • QImage to „tablica pikseli w pamięci” kodu klienta. QImage została zaprojektowana i zoptymalizowana pod kątem operacji we / wy oraz bezpośredniego dostępu do pikseli i manipulowania nimi.

    Kiedy używać QImage : Jeśli chcesz rysować za pomocą Qpaint lub manipulować pikselami obrazu.

  • QBitmap to tylko wygodna podklasa QPixmap zapewniająca głębię 1, jest to monochromatyczna (1-bitowa głębia) pixmapa. Podobnie jak QPixmap, QBitmap jest zoptymalizowany pod kątem niejawnego udostępniania danych.

  • QPicture to urządzenie do malowania, które rejestruje i odtwarza polecenia QPainter - rysunek -
Mohammad Kanan
źródło