Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 14:49 Есть изображение, скажем массив RGB. Надо его быстро отобразить на экран. У кого какие соображения.
В данное время происходит так: создаю QImage в цикле ставлю setPixel у картинки и вывожу ее на экран с помощью QPainter но тормозно ужастно Название: Быстрый вывод картинки Отправлено: Sergeich от Апрель 28, 2005, 15:01 Самое быстрое что можно сделать - использовать OpenGL
Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 15:13 а можно пример в студию!
Название: Быстрый вывод картинки Отправлено: Ruslan Popov от Апрель 28, 2005, 15:29 Вот альтернативный вариант с использованием SDL.
Внедрение SDL окна в Qt виджет: http://forum.sources.ru/index.php?act=Attach&type=post&id=695090 Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 15:39 это SDL внедрять в проект
а это его утяжелит Название: Быстрый вывод картинки Отправлено: Ruslan Popov от Апрель 28, 2005, 15:45 Компакт-диски весят немного.
Кстати, если на CD записать на 200 мегабайт больше, он сильно потяжелеет в смысле веса? :) И с каких пор OpenGL стал стандартной фичей Windows??? Название: Быстрый вывод картинки Отправлено: Sergeich от Апрель 28, 2005, 16:12 Цитата: "Admin" а можно пример в студию! Дык сам напиши... там все просто: создаешь QGLWidget, и в paintGL() юзаешь ф-ции glRasterPos() и glDrawPixels() Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 17:15 1. Часто программы скачивают из инета. А там размер важен, скачать 1 мег и 10 мег - большая разница
2. А OpenGL насколько быстрее будет? Название: Быстрый вывод картинки Отправлено: Sergeich от Апрель 28, 2005, 17:29 Цитата: "Admin" 1. Часто программы скачивают из инета. А там размер важен, скачать 1 мег и 10 мег - большая разница А причем тут сеть? Можно поподробнее... Цитата: "Admin" 2. А OpenGL насколько быстрее будет? Все зависит от конфигурации: от скорости системной шины, скорости памяти и особенно от видеокарты Название: Быстрый вывод картинки Отправлено: Racheengel от Апрель 28, 2005, 17:50 Погоди... я так понимаю, уважаемому надо, что это работало ПРОСТО БЫСТРЕЕ. А ведь не факт, что у пользователей его проги будет работоспособен Gl. Да и применение такой библиотеки для подобной задачи - дело весьма сомнительное ИМХО...
Название: Быстрый вывод картинки Отправлено: Sergeich от Апрель 28, 2005, 18:10 На самом деле все зависит от задачи, если надо быстро перекидывать байты из памяти на экран, то лучше юзать OpenGL, т.к. он работает напрямую с буфером кадра. А по поводу работоспособности OpenGL: под виндой это вообще не проблема, под линухом конечно нужно ставить дрова, но по крайней мере для NVidia чипов с этим проблем нет и вроде в последнее время исчезли проблемы с ATI.
Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 21:55 я вообще хотел способов типа
1. Использовать BitBlt. Я просто не очень понял, как его использовать 2. Использование HDC хендла возращаемого QPainter У вас есть решения, основанные на этом подходе? Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:28 я эту проблему решил. Всё зависит от того, КАК ты получаешь картинку, которую надо вывести на экран. Если это простой несжатый RGB поток, и решение нужно только под X11, то нужно использовать MIT-SHM - в этом случае отрисовка летает. Если очень надо, могу прислать нужный класс [давай мейл].
P.S. Отрисовка QImage будет торомозить _всегда_, т.к. QImage сначала перегоняется в QPixmap, а потом только рисуется. Даже в доке написано, что такое преобразование очень медленное, да и ты сам можем убедиться, посетив qpixmap_x11.cpp из дистриба qt :) Название: Быстрый вывод картинки Отправлено: Admin от Апрель 28, 2005, 23:33 а сюда можешь приатачить?
я думаю будет интересно всем!! Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:36 ктсати, setPixel делать не надо. у QImage есть конструктор, который позволяет создавать объект из несжатых данных (RGB/RGBA/Indexed):
Код:
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:38 и ещё - OpenGL крайне не рекомедую - это сильно device-dependend решение, ну ты понял :) Томозить это будет без драйверов на видео ОЧЕНЬ сильно.
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:40 Код:
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:41 Код:
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 28, 2005, 23:44 Работает с несжатыми данными RGBA. Использование:
Код:
Название: Быстрый вывод картинки Отправлено: Admin от Апрель 29, 2005, 00:07 надо попробовать
только вот colortable пугает Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 29, 2005, 00:15 чем ? :) Если данные 32-битные (RGBA), colortable = NULL.
Название: Быстрый вывод картинки Отправлено: Admin от Апрель 29, 2005, 00:16 у меня данные RGB и без палитры
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 29, 2005, 00:29 надо RGBA - RGB QImage'ем не поддерживается. без палитры, как я уже говорил, colortable = NULL, numColors = 0.
Название: Быстрый вывод картинки Отправлено: Admin от Апрель 29, 2005, 07:18 понятно спасибо
буду значит преобразовывать в промежуточныйй формат Название: Быстрый вывод картинки Отправлено: Admin от Апрель 29, 2005, 08:52 в продолжение:
есть QScroollView, в нем картинка сидит QImage при движение scrollbar картинка смещается и позволяет пользователю просматривать ее, когда она больше чем экран так вот такой код в paintEvent Код: QPixmap pm(*m_pQImg); отрабатывает, но возникает проблема, что картинка ездит прекрасно но края не переририсоваваются. Это понятно когда прогу свернешь и развернешь. Тогда рисует все ок. что бы послать такое, QScrollBar что бы он перерисовался Название: Быстрый вывод картинки Отправлено: Ruslan Popov от Апрель 29, 2005, 08:59 А я вчера SDLWidget внедрил в свой проект и оно даже работает :)
Добавил в него функциональность для работы с оверлеем. Постараюсь на выходных начать бросать на него кадры из потока... Насчёт перерисовки, у тебя QPaintEvent не появляется, зови ручками... Название: В продолжение темы... Отправлено: west от Апрель 29, 2005, 11:06 У меня приложение MDI, размер загружемых изображений до гига. Проверял 1300 Мбт, грузило нормально (но долго). Машинки по т.з. слабенькие , ULTRA SPARC 1000, видео стоит совсем дохленькое. GL вертится, но слабо. А с загруженными изображениями еще надо работать - менять яркость - контраст, масштаб, рисовать объекты и ессетственно скроллировать. Поэтому пришлось делать так - документе (MDI) хранил unsigned char* массив данных изображения. В docView (он наследован от QScrollView) размещал QImage* m_pImage, размером с видимую userу часть viewport'а. Все события по изменению размера viewport - скроллы, ресайз, масштаб и все такое завязаны на свой метод типа createImage, куда передаю новый размер окна и положение ползунков. В соответствии с этими данными формирую новое изображение. Т.е. сначала сохраняю существующую палитру из QImage::colorTable , потом m_pImage-reset() m_pImage->create(.........), потом копирование ( memcpy) соответствующей позиции скроллов и размеру View части изображения из unsigned char* прямо в m_pImage->bits(), копирование назад в новое изображение палитры. Для рисования переописал drawContext(....), в нем вызываю painter->drawImage(....).
где, естесственно рисую свой новый Image. paintEvent не трогал вообще. Получается следующее: дергаешь скролл, попадаешь в обработчик скролла, в котором создается новое изображение. DrawContext система вызовет сама. Для отдельных случаев написал repaintImage, в котором вызывается тот же drawContext , только с параметрами по перерисовке всей видимой области. (Если он вызывается системой, то перерисовывает только добавившуюся , например при рисайзе, часть изображения). Впринципе, своего добился, если изображение загружется (оперативки всего 512 метров, > 700Мбт свопит жутко), то работает быстро. Название: Быстрый вывод картинки Отправлено: Ruslan Popov от Апрель 29, 2005, 12:16 Я не разбирался с таким вопросом, но думаю в SDL на эту тему есть ответ.
Но если подойти в общем к решению проблемы, то надо посмотреть в сторону mmap (на MSWin тоже есть подобное). Смысл - отображение куска файла в память и никаких свопов! Название: Быстрый вывод картинки Отправлено: west от Апрель 29, 2005, 13:25 Если изображение больше размера оперативки, свопить будет полюбому. Не к файлу же мне каждый раз обращаться.
Название: Быстрый вывод картинки Отправлено: Zmey от Апрель 29, 2005, 13:34 Почему бы не использовать QCanvas, QCanvasImage?
Я вывожу через него картинку 2000х1000 12 бит, работает мгновенно. Название: Быстрый вывод картинки Отправлено: Ruslan Popov от Апрель 29, 2005, 13:48 Цитата: "west" Если изображение больше размера оперативки, свопить будет полюбому. Не к файлу же мне каждый раз обращаться. Умные люди не зря mmap реализовали! Вы почитайте документацию. Вы будете работать с изображением любого размера, как-будто оно находится в оперативной памяти. На экран выводится всё равно только небольшая его часть. В данное время вы тратите время на подкачку всего изображения в память, но потом работаете быстро. В предлагаемом варианте, пользователь быстро получит доступ к куску изображения, а вы закэшируете куски картинки по краям отображенного пользователю "окна" и при скролле, отобразите данные из кэша и так далее. Название: Быстрый вывод картинки Отправлено: west от Апрель 29, 2005, 16:19 Оно свопит у меня при загрузке. А при работе все ок. А насчет mmap - посмотрю обязательно.
Название: Быстрый вывод картинки Отправлено: Keiko от Апрель 29, 2005, 16:22 Zmey
Пока дело не доходит до масштабирования ;) |