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?


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.

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.

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.


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).


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 -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.