Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Yegor от Октябрь 12, 2012, 20:00



Название: QImage и QPixmap
Отправлено: Yegor от Октябрь 12, 2012, 20:00
Здравствуйте!

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


Название: Re: QImage и QPixmap
Отправлено: navrocky от Октябрь 12, 2012, 20:59
Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.

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

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

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


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


Название: Re: QImage и QPixmap
Отправлено: LisandreL от Октябрь 12, 2012, 22:05
Ещё важный момент, что с QImage и QPicture можно работать в любом потоке, а с QPixmap только в основном (гуёвом).


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

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

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

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


Название: Re: QImage и QPixmap
Отправлено: Igors от Октябрь 13, 2012, 09:45
Для рисования в QPixmap могут применяться различные бэкенды, к примеру, X11, raster, OpenGl. В случае с QImage - только raster.
Я проверял текст (проектик заливал на этот форум) и никакой разницы не нашел. В профайлере видно что машина одна и та же, никаких аппаратных средств (и вызовов OC) не привлекается. Да, и меня смутило что оба вывода (в QImage и в QPixmap) почему-то намного медленнее прямого вывода на экран ???  Повторюсь - понимаю что для каких-то выводов нет оснований.


Название: Re: QImage и QPixmap
Отправлено: Syveren от Октябрь 13, 2012, 11:03
Цитировать
почему-то намного медленнее прямого вывода на экран
А каким образон напрямую выводить на экран?
В одном проекте, где требовались маштабированние, обрезка, поворот, и т.п и вывод всего этого на экран, QImage показал более хорошие результаты. (И при больших изображениях чуствовались подтормаживания при использовании QPixmap. После замены на QImage они пропали).
Если нужно отобразить изображение без манипуляций с ним и без использования потоков использую QPixmap, иначе QImage


Название: Re: QImage и QPixmap
Отправлено: navrocky от Октябрь 13, 2012, 12:45
А каким образон напрямую выводить на экран?

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


Название: Re: QImage и QPixmap
Отправлено: GreatSnake от Октябрь 13, 2012, 13:19
Надо окну выставить атрибут Qt::WA_PaintOnScreen.

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


Название: Re: QImage и QPixmap
Отправлено: Igors от Октябрь 13, 2012, 13:31
А каким образон напрямую выводить на экран?
Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Я и не помышлял о прямом доступе к видео (не те времена). Имелось ввиду просто использование QPainter(widgetPtr) вместо напр QPainter(imagePtr).