Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро и красиво отрисовать огромный битмап?


Страницы:   1 2 3

V ©   (2010-01-07 14:53:00) 

Добрый день. Возникла острейшая необходимость уместить в экран огромный битмап (до 15000*5000 пикс), который генерируется программой, в небольшое окошко.. ну в общем на этом битмапе изображена в масштабе 1 пикс/мм огромная жужа. Жужа эта чертится параметрически, параметров много, все завязано на углы, на габариты и тп, там есть текст, проставлены размеры.. В общем код отрисовки этого битмапа велик и что-либо в нем менять - может произойти нервный срыв.

Дело в том, что сама картинка рисуется достаточно быстро, но вот StretchDraw() в размеры моего окна (с сохранением пропорций) дают неадекватный результат, многие линии пропадают, текст как-то кусками стирается.. неприятно. Поэтому я немного погуглив наткнулся на модуль resample.pas, там несколько фильтров, картинка масштабируется в нужные мне размеры, все приятно, все красиво, но!!! лично меня не устраивает то что фильтр работает достаточно долго, приходится дожидаться результата 1-2 сек

Посему прошу совета, как мне быть, чтобы работало быстро и красиво одновременно?


antonn   (2010-01-08 21:53:00) [1]


> Вы думаете что так будет быстрее?

ну если прикинуть, что пользователь смотрит на картинку значительно больше времени, чем изменяет ее - то быстрее будет один раз уменьшить до превью, а потом много раз уменьшать превью, разница может быть значительной (у картинки со сторонами в 2 раза меньше пикселов в 4 раза меньше, т.е. за это время можно отобразить 4 раза превью, или 1 раз полноценное)


DVM   (2010-01-08 17:53:00) [2]


> Anatoly Podgoretsky ©   (08.01.10 16:56) [47]

ну и теперь во всех масштабах надо умножить


Anatoly Podgoretsky   (2010-01-08 16:56:00) [3]

> DVM  (08.01.2010 16:36:45)  [45]

228 МБ на полноразмерную картинку в 32 битах


DVM   (2010-01-08 16:38:00) [4]


> пока пользователь смотрит на картинку, два потока втихую
> создают картинки для масштабов +1 и -1 от текущего.

это скока ж памяти потребует при его размерах картинок страшно представить


DVM   (2010-01-08 16:36:00) [5]

что то сомнительно, чтобы пользователю нужны всенепременно все детали на превьюшке этого твоего огромного изображения. Надо не так. По каждому чиху юзера генерировать упрощенную превьюшку, пусть довольствуется ей, в фоне же начинать генерацию полноценной картинки которой превьюшку можно и заменить потом. Вообще пользователям надо понимать, что компьютер не может мгновенно как ни крути выполнять сложные вещи и в лбом случае придется подождать, даже если и не на 15000 на 15000 то на 50000 на 50000 то уж точно.


V   (2010-01-08 14:41:00) [6]


> Virgo_Style © (08.01.10 14:21) [43]

Привожу заголовок одной из многих рисовальных процедур:
Procedure CFBottom(Bitmap:Graphics.TBitmap; x,y,D,rt,alpha,ds,h:Integer);
D - диаметр. Bitmap.Width = D
Допустим диаметр = 3500мм
При этом диаметре картинка получается одна.
Теперь пользователь меняет диаметр, все остальные параметры остаются прежними. Картинка сразу же перечерчивается, масштабируется, выводится.
Таким образом наглядно видно влияние каждого параметра на геометрическую форму (и как следствие на всякие площади поверхностей, массу и тд)
А таких рисовальных процедур куча... и у всех все разное..

Делать 50(или около того, а может больше) потоков, в которых будут втихую рисоваться разные возможные конфигурации - ну да.. извращение :)


Virgo_Style   (2010-01-08 14:21:00) [7]

На правах извращения:

пока пользователь смотрит на картинку, два потока втихую создают картинки для масштабов +1 и -1 от текущего.

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


V   (2010-01-08 13:58:00) [8]

Ну как ни крути, приходится изображение уменьшать
чтобы

> превью его показывать

нужно же его сресайзить...

Я тут подумал.... сделаю ка я кнопочку, назову ее "Apply" и по клику буду перерисовывать...
Быстро и почти безболезненно


12   (2010-01-08 13:19:00) [9]

а если делать большого изображения копию с толстыми линиями, и превью его показывать?


V   (2010-01-08 13:04:00) [10]


> делается превью огромного изображения, например что то среднее
> по размерам с исходником и областью вывода. И при выводе
> с еще бОльшим уменьшением всего битмапа уменьшается не исходник,
>  а превью

Вы думаете что так будет быстрее?

Представьте ситуацию, пользователь кликнул по спинБуттону, там циферка поменялась, вся геометрия пересчиталась, огромный битмап заново перечертился (0,1сек) и 1,5-2 секунды ждать пока сожмется и обновится изображение...
А если он 10 раз быстро щелкнул... создается ощущение что висим..

То есть все равно придется сначала уменьшать до средних размеров, а потом сразу же со средних до маленьких... Это разве не лишнее телодвижение?


antonn   (2010-01-08 09:23:00) [11]


> ???

делается превью огромного изображения, например что то среднее по размерам с исходником и областью вывода. И при выводе с еще бОльшим уменьшением всего битмапа уменьшается не исходник, а превью - у него площадь меньше, и филрейт нужен меньший, а при сильных уменьшениях все равно будет смазано. Это если необходимо масштабирование "реалтайм", а если просто показать картинку в уменьшеном варианте - уменьшаем в буфер единожды, а буфер выводим.


Германн   (2010-01-08 03:02:00) [12]


> Демо ©   (08.01.10 02:51) [37]
...
> Решение, которое в глаза бросается - заранее уменьшить картинку
> до нужного масштаба и работать с ней.


> Возникла острейшая необходимость уместить в экран огромный
> битмап (до 15000*5000 пикс), который генерируется программой

???


Демо   (2010-01-08 02:51:00) [13]


> V   (08.01.10 00:58) [35]
> Народ, ну действительно, много слов, споров про векторные
> редакторы и тп... а метафайл может мне как помочь ? и ни
> одного коммента по поводу моей затеи с OpenGL....и отодвиганием
> камеры...


Решение, которое в глаза бросается - заранее уменьшить картинку до нужного масштаба и работать с ней.


Германн   (2010-01-08 02:31:00) [14]


> V   (08.01.10 00:58) [35]
>
> Народ, ну действительно, много слов, споров про векторные
> редакторы и тп... а метафайл может мне как помочь ? и ни
> одного коммента по поводу моей затеи с OpenGL....и отодвиганием
> камеры...

Имхо ни твой сабж, ни твою "затею" так никто и не понял.


V   (2010-01-08 00:58:00) [15]

Народ, ну действительно, много слов, споров про векторные редакторы и тп... а метафайл может мне как помочь ? и ни одного коммента по поводу моей затеи с OpenGL....и отодвиганием камеры...


Демо   (2010-01-08 00:34:00) [16]

Удалено модератором
Примечание: Offtopic


Anatoly Podgoretsky   (2010-01-07 23:11:00) [17]

Удалено модератором
Примечание: Offtopic


Jeer   (2010-01-07 23:05:00) [18]

Удалено модератором
Примечание: Offtopic


Jeer   (2010-01-07 21:34:00) [19]

Удалено модератором
Примечание: Offtopic


Jeer   (2010-01-07 21:30:00) [20]


> Anatoly Podgoretsky ©   (07.01.10 20:15) [28]
>
> > DVM  (07.01.2010 20:01:27)  [27]
>
> Шутки, шуткам, а то в некоторых фильмах из одно/двух пикселей
> восстанавливаю и народ милицейский верит этому.


Да, в общем-то, я с помощью простейшего телескопа и web-камеры + Registax восстанавливаю кольца Сатурна с их тонкой структурой:)
Но, это уже не в тему.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо