Russian Qt Forum

Qt => Мультимедиа => Тема начата: Ground от Июль 15, 2011, 13:55



Название: QPixmap и память
Отправлено: Ground от Июль 15, 2011, 13:55
Доброго времени суток!
Есть изображение, 3000х2000пкс, весит 2мб, при загрузке в QPixmap дает 3000*2000*32 = 19,2Мб. Как оптимизировать расход памяти? Подскажите общие принципы решения этой проблемы?


Название: Re: QPixmap и память
Отправлено: Пантер от Июль 15, 2011, 14:05
Изображение видимо jpeg? ;)


Название: Re: QPixmap и память
Отправлено: Ground от Июль 15, 2011, 14:29
Изображение видимо jpeg? ;)
А имеет значение? Предполагается работа с PNG и JPEG.


Название: Re: QPixmap и память
Отправлено: Пантер от Июль 15, 2011, 14:31
Ну, просто в PNG и JPEG изображение сжато. А в QPixmap оно "разжато". Так что не парься - так и должно быть.


Название: Re: QPixmap и память
Отправлено: Ground от Июль 15, 2011, 15:09
Ну, просто в PNG и JPEG изображение сжато. А в QPixmap оно "разжато". Так что не парься - так и должно быть.

Да ПО планируется использовать на маломощных рабочих станциях, где ценится каждый мегабайт.

Пока что в мыслях примерно следующая концепция: загружать картинку в память в виде raw data, потом в PaintEvent выводить требуемую часть изображения (но как это все провернуть - не знаю). При максимальном разрешении в 1920х1080 (а вероятно, будет даже использоваться разрешение 1024х768) мы получим расход памяти ~8Мб, что уже лучше. Но тут возникает вопрос - не нагрузим ли мы процессор такими преобразованиями в каждом PaintEvent?
А вообще, не хотелось бы изобретать велосипедов - может быть есть какой-нибудь способ проще?


Название: Re: QPixmap и память
Отправлено: GreatSnake от Июль 15, 2011, 15:24
Грузи картинку в QImage.
Отрисовку делай как в первом варианте (http://www.prog.org.ru/index.php?topic=8266.msg102364#msg102364).
И надо знать, что QPixmap хранится на стороне сервера, а QImage на стороне клиента.


Название: Re: QPixmap и память
Отправлено: Igors от Июль 15, 2011, 16:26
И надо знать, что QPixmap хранится на стороне сервера, а QImage на стороне клиента.
Я читал эту фразу но не совсем понял: кто здесь "сервер"? Видеопамять? GPU? Это возможно но "если железо позволяет" - и всегда можно создать такое кол-во QPixmap что расход по ресурсам будет превышен.

Да ПО планируется использовать на маломощных рабочих станциях, где ценится каждый мегабайт.

Пока что в мыслях примерно следующая концепция: загружать картинку в память в виде raw data, потом в PaintEvent выводить требуемую часть изображения (но как это все провернуть - не знаю). При максимальном разрешении в 1920х1080 (а вероятно, будет даже использоваться разрешение 1024х768) мы получим расход памяти ~8Мб, что уже лучше. Но тут возникает вопрос - не нагрузим ли мы процессор такими преобразованиями в каждом PaintEvent?
А вообще, не хотелось бы изобретать велосипедов - может быть есть какой-нибудь способ проще?
Понятно что лучше "быть богатым и здоровым", но так не всегда выходит :)  Здесь важно не только (в может и не столько) максимальный размер имеджа, но и число имеджей которые должны быть одновременно загружены. Очень просто но полезно сразу завести ограничитель в preferences. напр

MAX_IMAGE_SIZE = 1024

Если железо совсем слабенькое - ставите поменьше и сразу scale больших имеджей при загрузке. Худо-бедно но работать будет. А увлекаясь оптимизацией Вы можете оказаться в неудобном положении когда в один прекрасный день у заказчика появится новое железо.

Увеличивать только нужную часть изображения в paintEvent (как показал GreatSnake) придется - но это часто неизбежно и на хорошем железе - напр. когда нужны очень большие увеличения


Название: Re: QPixmap и память
Отправлено: Ubuntu_linux от Июль 16, 2011, 12:27
Хи-хи, какой бред ;)
С всеми задачами может с лихвой справиться QImageReader! Там есть все что вам надо.


Название: Re: QPixmap и память
Отправлено: GreatSnake от Июль 16, 2011, 14:46
И надо знать, что QPixmap хранится на стороне сервера, а QImage на стороне клиента.
Я читал эту фразу но не совсем понял: кто здесь "сервер"? Видеопамять? GPU? Это возможно но "если железо позволяет" - и всегда можно создать такое кол-во QPixmap что расход по ресурсам будет превышен.
Pixmap в случае X11 хранится в памяти Xserver, в случае Win в GDI. Поэтому при любых работах с картинкой (композинг, масштабирование и т.д.) делается копирование содержимого пиксмапа в программу и обратно в сервер после обработки.
Имея слабые мощности это нужно иметь в виду.