Russian Qt Forum
Ноябрь 25, 2024, 02:13
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
QImage и QPixmap
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QImage и QPixmap (Прочитано 9258 раз)
Yegor
Гость
QImage и QPixmap
«
:
Октябрь 12, 2012, 20:00 »
Здравствуйте!
Какая разница между
QImage
и
QPixmap
?
Какой из этих классов лучше использовать?
Записан
navrocky
Гипер активный житель
Offline
Сообщений: 817
Погроммист
Re: QImage и QPixmap
«
Ответ #1 :
Октябрь 12, 2012, 20:59 »
Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.
QImage - находится в памяти вашего процесса, соответственно имеется возможность доступаться напрямую к этой области памяти. Минус QImage - медленная отрисовка на экране. Рисование графических примитивов в QImage производится чисто программно.
QPixmap - противоположность, он наоборот физически находится не в вашем процессе. Рисование примитивов может производиться с аппаратным ускорением. Но доступ к данным картинки на прямую отсутствует.
Использование того или другого зависит от конкретной задачи.
Записан
Гугль в помощь
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QImage и QPixmap
«
Ответ #2 :
Октябрь 12, 2012, 21:16 »
Цитата: navrocky от Октябрь 12, 2012, 20:59
Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.
Мои скромные эксперименты не показали никаких преимуществ QPixmap по скорости. В обоих случаях использовалась машина рисования Qt которая ощутимо медленнее средств OC. Конечно ни на какие обобщения/выводы я не претендую
В любом случае иметь удобный доступ к пыкселям (QImage) важно и может перевесить (мифическое) ускорение.
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: QImage и QPixmap
«
Ответ #3 :
Октябрь 12, 2012, 22:05 »
Ещё важный момент, что с QImage и QPicture можно работать в любом потоке, а с QPixmap только в основном (гуёвом).
Записан
navrocky
Гипер активный житель
Offline
Сообщений: 817
Погроммист
Re: QImage и QPixmap
«
Ответ #4 :
Октябрь 12, 2012, 23:47 »
Цитата: Igors от Октябрь 12, 2012, 21:16
Цитата: navrocky от Октябрь 12, 2012, 20:59
Вкратце, для попиксельной обработки лучше подойдет QImage, для рисования примитивов (линии, текст, заливки) - QPixmap.
Мои скромные эксперименты не показали никаких преимуществ QPixmap по скорости. В обоих случаях использовалась машина рисования Qt которая ощутимо медленнее средств OC. Конечно ни на какие обобщения/выводы я не претендую
В любом случае иметь удобный доступ к пыкселям (QImage) важно и может перевесить (мифическое) ускорение.
Под линуксом, к примеру, QPixmap хранится на X-сервере, и, теоретически, может быть загружен в память видеокарты и выводиться на экран очень быстро. При отрисовке QImage картинка переправляется и конвертируется в родной режим карты каждый раз.
Для рисования в QPixmap могут применяться различные бэкенды, к примеру, X11, raster, OpenGl. В случае с QImage - только raster.
В винде есть тоже два вида изображений: DDB (QPixmap) и DIB (QImage). DDB выводится на экран значительно быстрее.
Записан
Гугль в помощь
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QImage и QPixmap
«
Ответ #5 :
Октябрь 13, 2012, 09:45 »
Цитата: navrocky от Октябрь 12, 2012, 23:47
Для рисования в QPixmap могут применяться различные бэкенды, к примеру, X11, raster, OpenGl. В случае с QImage - только raster.
Я проверял текст (проектик заливал на этот форум) и никакой разницы не нашел. В профайлере видно что машина одна и та же, никаких аппаратных средств (и вызовов OC) не привлекается. Да, и меня смутило что оба вывода (в QImage и в QPixmap) почему-то намного медленнее прямого вывода на экран
Повторюсь - понимаю что для каких-то выводов нет оснований.
Записан
Syveren
Гость
Re: QImage и QPixmap
«
Ответ #6 :
Октябрь 13, 2012, 11:03 »
Цитировать
почему-то намного медленнее прямого вывода на экран
А каким образон напрямую выводить на экран?
В одном проекте, где требовались маштабированние, обрезка, поворот, и т.п и вывод всего этого на экран, QImage показал более хорошие результаты. (И при больших изображениях чуствовались подтормаживания при использовании QPixmap. После замены на QImage они пропали).
Если нужно отобразить изображение без манипуляций с ним и без использования потоков использую QPixmap, иначе QImage
Записан
navrocky
Гипер активный житель
Offline
Сообщений: 817
Погроммист
Re: QImage и QPixmap
«
Ответ #7 :
Октябрь 13, 2012, 12:45 »
Цитата: Syveren от Октябрь 13, 2012, 11:03
А каким образон напрямую выводить на экран?
Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Записан
Гугль в помощь
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: QImage и QPixmap
«
Ответ #8 :
Октябрь 13, 2012, 13:19 »
Цитата: navrocky от Октябрь 13, 2012, 12:45
Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Цитата: assistant
Виджеты с установленным этим атрибутом не участвуют в управлении композицией, т.е. они не могут быть полупрозрачными или просвечивать сквозь полупрозрачные перекрывающие их виджеты.
Замечание:
Этот флаг поддерживается только на X11 и он отключает двойную буферизацию. В Qt для встраиваемых Linux-систем флаг работает только когда установлен на виджете верхнего уровня и опирается на поддержку со стороны активного драйвера экрана.
«
Последнее редактирование: Октябрь 13, 2012, 13:20 от GreatSnake
»
Записан
Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QImage и QPixmap
«
Ответ #9 :
Октябрь 13, 2012, 13:31 »
Цитата: Syveren от Октябрь 13, 2012, 11:03
А каким образон напрямую выводить на экран?
Цитата: navrocky от Октябрь 13, 2012, 12:45
Надо окну выставить атрибут Qt::WA_PaintOnScreen.
Я и не помышлял о прямом доступе к видео (не те времена). Имелось ввиду просто использование QPainter(widgetPtr) вместо напр QPainter(imagePtr).
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...