Russian Qt Forum
Ноябрь 25, 2024, 05:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QImage и QPixmap  (Прочитано 9269 раз)
Yegor
Гость
« : Октябрь 12, 2012, 20:00 »

Здравствуйте!

Какая разница между QImage и QPixmap?
Какой из этих классов лучше использовать?
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Октябрь 12, 2012, 20:59 »

Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.

QImage - находится в памяти вашего процесса, соответственно имеется возможность доступаться напрямую к этой области памяти. Минус QImage - медленная отрисовка на экране. Рисование графических примитивов в QImage производится чисто программно.

QPixmap - противоположность, он наоборот физически находится не в вашем процессе. Рисование примитивов может производиться с аппаратным ускорением. Но доступ к данным картинки на прямую отсутствует.

Использование того или другого зависит от конкретной задачи.
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 12, 2012, 21:16 »

Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.
Мои скромные эксперименты не показали никаких преимуществ QPixmap по скорости. В обоих случаях использовалась машина рисования Qt которая ощутимо медленнее средств OC. Конечно ни на какие обобщения/выводы я не претендую Улыбающийся В любом случае иметь удобный доступ к пыкселям (QImage) важно и может перевесить (мифическое) ускорение.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Октябрь 12, 2012, 22:05 »

Ещё важный момент, что с QImage и QPicture можно работать в любом потоке, а с QPixmap только в основном (гуёвом).
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Октябрь 12, 2012, 23:47 »

Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.
Мои скромные эксперименты не показали никаких преимуществ QPixmap по скорости. В обоих случаях использовалась машина рисования Qt которая ощутимо медленнее средств OC. Конечно ни на какие обобщения/выводы я не претендую Улыбающийся В любом случае иметь удобный доступ к пыкселям (QImage) важно и может перевесить (мифическое) ускорение.

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

Для рисования в QPixmap могут применяться различные бэкенды, к примеру, X11, raster, OpenGl. В случае с QImage - только raster.

В винде есть тоже два вида изображений: DDB (QPixmap) и DIB (QImage). DDB выводится на экран значительно быстрее.
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 13, 2012, 09:45 »

Для рисования в QPixmap могут применяться различные бэкенды, к примеру, X11, raster, OpenGl. В случае с QImage - только raster.
Я проверял текст (проектик заливал на этот форум) и никакой разницы не нашел. В профайлере видно что машина одна и та же, никаких аппаратных средств (и вызовов OC) не привлекается. Да, и меня смутило что оба вывода (в QImage и в QPixmap) почему-то намного медленнее прямого вывода на экран Непонимающий  Повторюсь - понимаю что для каких-то выводов нет оснований.
Записан
Syveren
Гость
« Ответ #6 : Октябрь 13, 2012, 11:03 »

Цитировать
почему-то намного медленнее прямого вывода на экран
А каким образон напрямую выводить на экран?
В одном проекте, где требовались маштабированние, обрезка, поворот, и т.п и вывод всего этого на экран, QImage показал более хорошие результаты. (И при больших изображениях чуствовались подтормаживания при использовании QPixmap. После замены на QImage они пропали).
Если нужно отобразить изображение без манипуляций с ним и без использования потоков использую QPixmap, иначе QImage
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Октябрь 13, 2012, 12:45 »

А каким образон напрямую выводить на экран?

Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Записан

Гугль в помощь
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Октябрь 13, 2012, 13:19 »

Надо окну выставить атрибут Qt::WA_PaintOnScreen.

Цитата: assistant
Виджеты с установленным этим атрибутом не участвуют в управлении композицией, т.е. они не могут быть полупрозрачными или просвечивать сквозь полупрозрачные перекрывающие их виджеты. Замечание: Этот флаг поддерживается только на X11 и он отключает двойную буферизацию. В Qt для встраиваемых Linux-систем флаг работает только когда установлен на виджете верхнего уровня и опирается на поддержку со стороны активного драйвера экрана.
« Последнее редактирование: Октябрь 13, 2012, 13:20 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 13, 2012, 13:31 »

А каким образон напрямую выводить на экран?
Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Я и не помышлял о прямом доступе к видео (не те времена). Имелось ввиду просто использование QPainter(widgetPtr) вместо напр QPainter(imagePtr). 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 23.