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 сек

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


Palladin   (2010-01-07 20:50:00) [21]

а еще бывает и камеру разворачивают вокруг цели )


Anatoly Podgoretsky   (2010-01-07 20:15:00) [22]

> DVM  (07.01.2010 20:01:27)  [27]

Шутки, шуткам, а то в некоторых фильмах из одно/двух пикселей восстанавливаю и народ милицейский верит этому.


DVM   (2010-01-07 20:01:00) [23]


> Sunktor ©  


> Там с видеозаписи восстанавливают, это не одно и то-же.

Ты серьезно? Я вообще то пошутил :)


Sunktor   (2010-01-07 19:52:00) [24]

> в фильмах про CSI без проблем восстанавливают
Там с видеозаписи восстанавливают, это не одно и то-же.
Картинка меняется от кадра к кадру, и в этом случае на базе этих изменений можно восстановить первоначальную информацию, до определенной степени разумеется.


antonn   (2010-01-07 19:34:00) [25]


> Что ты пристал со своим векторным редактором, если у автора
> растр.

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


Anatoly Podgoretsky   (2010-01-07 19:28:00) [26]

> antonn  (07.01.2010 19:22:23)  [23]

Что ты пристал со своим векторным редактором, если у автора растр.


antonn   (2010-01-07 19:22:00) [27]

а зачем? :)
зачем это делать если речь про "качественное уменьшение картинки"? если простейший рендер векторного редактора использует суперсемплинг для отображения "тонких и гладких линий" (не Безье, я про рендер), для отображения их на экране.
Извини, но умные слова "масштабирование вверх" здесь сказаны как-то не в тему, тут все более приземленное и менее буквоедствующее.


DVM   (2010-01-07 19:20:00) [28]


> Jeer ©   (07.01.10 19:02) [21]


> Восстанови (для меня - обещаю никому и на за что) из нижней
> картинки - верхнюю.

в фильмах про CSI без проблем восстанавливают: http://www.makemymood.com/wp-content/uploads/2009/10/csizoom.jpg :)


Jeer   (2010-01-07 19:02:00) [29]

Судя по всему - да.

Восстанови (для меня - обещаю никому и на за что) из нижней картинки - верхнюю.
Поверю, что ты- Волшебник.


antonn   (2010-01-07 19:00:00) [30]


> Аффтар (и antonn тоже) даже не понимает ( пока ) разницу
> между вектором и растром.

да что ты говоришь :)


Jeer   (2010-01-07 18:45:00) [31]


> DVM ©   (07.01.10 18:34) [17]


Аффтар (и antonn тоже) даже не понимает ( пока ) разницу между вектором и растром.
Cropping присутствует и в растровых engine.

Вопрос надо начинать с самого "конца" :)

Масштабирование вниз приводит к "слиянию" информации - т.е. к ее децимации/уменьшению.
Масштабирование вверх приводит, с переменным успехом, к экстраполяции - прогнозирование всегда чревато ошибками.


antonn   (2010-01-07 18:45:00) [32]


> DVM ©   (07.01.10 18:34) [17]

я так понял у него не векторный редактор, растр он уже получает готовый без возможности указать границы рисования.
тогда тут, имхо, остается для оптимизации иметь несколько "слегка" уменьшенных копии которые использовать для отображения всего холста (их "доуменьшить" проще).
ну а насчет уменьшения только нужной части при неполном отображении он бы наверное догадался, благо обходится простым canva.copyrect() на буфер, а буфер уже уменьшается копированием в зону вывода


DVM   (2010-01-07 18:34:00) [33]

antonn прав. аким бы не был редактор, перед выводом на экран все равно выводить картинку в битмап придется. Но вот тут есть море возможностей для оптимизации.


> V

Ни один векторный редактор не будет растрировать ВСЮ картинку, если видна только ее часть. Ни один векторный редактор не будет рисовать те линии которые не видны. Ни один векторный редактор не будет растировать 15000 на 15000 точек если планируется показать 1024 на 786  примеру.

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


Jeer   (2010-01-07 18:29:00) [34]

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

P.S.
Ресемплинг вниз всего лишь 1:4

http://s13.radikal.ru/i186/1001/d2/b12792fec9b3.png


antonn   (2010-01-07 18:04:00) [35]


> Anatoly Podgoretsky ©   (07.01.10 17:58) [11]
>
> > antonn  (07.01.2010 16:44:07)  [7]
>
> Ты не в курсе как работают векторные редакторы?

а ты в курсе как работает рендер векторного редактора? :)


Anatoly Podgoretsky   (2010-01-07 18:02:00) [36]


> V   (07.01.10 17:50) [10]

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


antonn   (2010-01-07 18:01:00) [37]


> Ресемплинг со сглаживанием был создан для "семплинга" вверх,
>  а не вниз.

ой, да как будет угодно :)
а мы тем временем используем этот термин и рисуем "тонкие линии". "...Но шмель не зает об этом и летает только поэтому" (с)


> Спасибо, работает быстрее в 2-3 раза (чем мыло), но все
> равно при огромных битмапах тормозит заметно, от чего делается
> неприятно.. и пользователю потом будет не особо приятно.
> .

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


Anatoly Podgoretsky   (2010-01-07 17:59:00) [38]

> Jeer  (07.01.2010 17:10:09)  [9]

Тем более, что в 10 или более раз.


Anatoly Podgoretsky   (2010-01-07 17:58:00) [39]

> antonn  (07.01.2010 16:44:07)  [7]

Ты не в курсе как работают векторные редакторы?


V   (2010-01-07 17:50:00) [40]

> Понимать как: v == Олег1963 ?

Нет.

> Lanczos/Mitchell

Спасибо, но.. это я пробовал до того как писать здесь, красиво, но долго работает на таких огромных картинках... кстати замыленность очень даже симпатично смотрится :)
В принципе
SetStretchBltMode(Dest.Canvas.Handle, STRETCH_HALFTONE);
StretchBlt(Dest.Canvas.Handle,0,0,dest.Width,dest.Height,Image.Canvas.Handle,0,0 ,image.Width,image.Height,srcCopy);

Спасибо, работает быстрее в 2-3 раза (чем мыло), но все равно при огромных битмапах тормозит заметно, от чего делается неприятно.. и пользователю потом будет не особо приятно..

Эх.. ну ладно :) Пока оставляем так, ждем вдохновения для масштабирования координат и рисования на битмапе уже нормального размера.. *грустный смайлик*

А вот я еще подумал, опенГЛ может ведь мою задачу наверное решить? Отодвинул камеру подальше и... или я не понимаю о чем веду речь?
Вообще это осуществимо?


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

Наверх

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