В чем разница между QImage и QPixmap?

85

Я не понимаю, в чем разница между QImage и QPixmap, похоже, они предлагают ту же функциональность. Когда мне следует использовать QImage, а когда - QPixmap?

Мистер Ту
источник
Я не уверен, понимаю ли я ваш вопрос, но мне показалось, что в документации это довольно ясно: «QImage разработан и оптимизирован для ввода-вывода, а также для прямого доступа к пикселям и манипуляции с ними, а QPixmap разработан и оптимизирован для отображения изображений. на экране." doc.qt.nokia.com/latest/qpixmap.html#details
cgmb
1
да уж! Я узнал это, но не очень хорошо понимаю, например, оптимизирован для ввода-вывода и оптимизирован для отображения, это разница, которую изображение показывает на платформе различия? .. Не могли бы вы помочь мне сделать шаг, чтобы объяснить .. спасибо ..
Мистер Ту,
Я все еще не уверен на 100%, что понимаю, что вы имеете в виду, но если вы используете QWidgets, вы можете отобразить это в QLabel. Если вы используете QGraphicsView, вы можете отобразить его в QGraphicsPixmapItem. Если вы используете QML, элемент Image сделает все за вас.
cgmb
Скажу по-другому, что такое Движок, в чем его работа? когда это использовать?
Мистер Ту,

Ответы:

55

Легко ответить, прочитав документацию по QImage и QPixmap :

Класс QPixmap - это представление изображения за пределами экрана, которое можно использовать в качестве устройства рисования.

Класс QImage обеспечивает аппаратно-независимое представление изображения, которое обеспечивает прямой доступ к данным пикселей и может использоваться в качестве устройства рисования.

Изменить: Кроме того, из ответа @Dave:

Вы не можете манипулировать QPixmap вне потока графического интерфейса пользователя, но QImage не имеет такого ограничения.

И от @Arnold:

Вот краткое изложение, которое обычно (не всегда) применимо:

  • Если вы планируете манипулировать изображением, изменять его, изменять пиксели на нем и т. Д., Используйте QImage.
  • Если вы планируете рисовать одно и то же изображение на экране более одного раза, преобразуйте его в QPixmap.
Карлфиллип
источник
спасибо за вашу помощь ... каков общий процесс, при котором QPixmpa и QImage загружают изображение ... что это в памяти ... спасибо ..
Mr.Tu
Я не уверен, что вы пытаетесь сделать, но в этом вопросе я демонстрирую, как загрузить данные YV12 с диска, преобразовать их в RGB с помощью шейдера фрагментов GLSL, а затем отобразить их на экране внутри QImage. Думаю, я мог бы указать вам правильное направление, если бы вы более четко понимали, чего пытаетесь достичь.
karlphillip
16
Это действительно на что-нибудь отвечает?
semisecure
7
Просто копировать документацию и ответы других людей не имеет смысла.
Вячеслав Кроилов
48

В Qt Labs есть хорошая серия статей, которые многое объясняют о графической системе Qt. В этой статье , в частности , имеет раздел QImageVS. QPixmap.

Вот краткое изложение, которое обычно (не всегда) применимо:

  • Если вы планируете манипулировать изображением, изменять его, изменять пиксели на нем и т. Д., Используйте файл QImage.
  • Если вы планируете рисовать одно и то же изображение на экране несколько раз, преобразуйте его в формат QPixmap.
Арнольд Спенс
источник
благодарю вас. Этот отрывок говорит нам: есть два разных способа загрузки изображения: растровый и OpenGL? верно?
Мистер Ту
Я не совсем понимаю вопрос. Ни "растр", ни "OpenGL" конкретно не представляют способы загрузки изображения.
Арнольд Спенс
37

Одним из важных отличий является то, что вы не можете создавать или управлять QPixmapчем-либо, кроме основного потока графического интерфейса. Однако вы можете создавать QImageэкземпляры и управлять ими в фоновых потоках, а затем преобразовывать их после передачи обратно в поток графического интерфейса.

Дэйв Матир
источник
22

Важно в промышленных условиях:

QPixmap хранится на видеокарте, выполняющей отображение. Не QImage.

Поэтому, если у вас есть сервер, на котором выполняется приложение, и клиентская станция, выполняющая отображение, это очень важно с точки зрения использования сети.

При использовании Pixmap перерисовка заключается в отправке по сети только команды на перерисовку (несколько байтов).

С QImage он заключается в отправке всего изображения (около нескольких МБ).

иксесс
источник
19
  • QPixmap - это «объект изображения», pixelпредставление которого не имеет значения в вашем коде. Таким образом, QPixmap разработан и оптимизирован для рендеринга изображений на экране дисплея, он хранится на XServer при использовании X11, поэтому рисование QPixmap в XWindow происходит намного быстрее, чем рисование. QImages, поскольку данные уже находятся на сервере и готовы к использованию.

    Когда использовать QPixmap : Если вы просто хотите рисовать существующее изображение (значок ... фон ... и т.д.) особенно часто, то используйте QPixmap.

  • QImage - это «массив пикселей в памяти» клиентского кода, QImage разработан и оптимизирован для ввода-вывода, а также для прямого доступа к пикселям и манипулирования ими.

    Когда использовать QImage : если вы хотите рисовать с помощью Qpaint или манипулировать пикселями изображения.

  • QBitmap - это всего лишь удобный подкласс QPixmap, обеспечивающий глубину 1, это монохромное (глубина 1 бит) растровое изображение. Как и QPixmap, QBitmap оптимизирован для использования неявного обмена данными.

  • QPicture - это устройство рисования, которое записывает и воспроизводит команды QPainter - ваш рисунок -
Мохаммад Канан
источник