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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPixmap и память  (Прочитано 7101 раз)
Ground
Гость
« : Июль 15, 2011, 13:55 »

Доброго времени суток!
Есть изображение, 3000х2000пкс, весит 2мб, при загрузке в QPixmap дает 3000*2000*32 = 19,2Мб. Как оптимизировать расход памяти? Подскажите общие принципы решения этой проблемы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 15, 2011, 14:05 »

Изображение видимо jpeg? Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ground
Гость
« Ответ #2 : Июль 15, 2011, 14:29 »

Изображение видимо jpeg? Подмигивающий
А имеет значение? Предполагается работа с PNG и JPEG.
« Последнее редактирование: Июль 15, 2011, 15:04 от Ground » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Июль 15, 2011, 14:31 »

Ну, просто в PNG и JPEG изображение сжато. А в QPixmap оно "разжато". Так что не парься - так и должно быть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ground
Гость
« Ответ #4 : Июль 15, 2011, 15:09 »

Ну, просто в PNG и JPEG изображение сжато. А в QPixmap оно "разжато". Так что не парься - так и должно быть.

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

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

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 15, 2011, 15:24 »

Грузи картинку в QImage.
Отрисовку делай как в первом варианте.
И надо знать, что QPixmap хранится на стороне сервера, а QImage на стороне клиента.
« Последнее редактирование: Июль 15, 2011, 15:26 от GreatSnake » Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 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) придется - но это часто неизбежно и на хорошем железе - напр. когда нужны очень большие увеличения
Записан
Ubuntu_linux
Гость
« Ответ #7 : Июль 16, 2011, 12:27 »

Хи-хи, какой бред Подмигивающий
С всеми задачами может с лихвой справиться QImageReader! Там есть все что вам надо.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Июль 16, 2011, 14:46 »

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

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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