Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
V   (2010-01-07 14:53) [0]

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

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

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


 
V   (2010-01-07 15:04) [1]

Добавлю, битмап можно pf2Bit, .... автокады-компасы и тп как то рисуют и не запариваются при этом


 
Jeer ©   (2010-01-07 15:25) [2]


> автокады-компасы и тп как то рисуют и не запариваются при
> этом


Это векторные редакторы, а у тебя растр.
Что ж ты хочешь ? Ну была у тебя линия в 1 pix толщиной, ты сделал resample 1:4. Как, по твоему должна выглядеть эта линия на экране толщиной в 0.25 pix ?
Правильно, ее не будет видно.

Включи серое вещество, он ж у тебя не просто так.


 
Олег1963   (2010-01-07 15:29) [3]

Удалено модератором
Примечание: Ты чего это со своим плачем залез в чужую ветку?


 
Jeer ©   (2010-01-07 15:41) [4]

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

P.S.
С Рождеством, однако :)


 
antonn ©   (2010-01-07 15:45) [5]


> Включи серое вещество, он ж у тебя не просто так.

еще один оригинал %)

автор, попробуй установить STRETCH_HALFTONE для канвы
SetStretchBltMode(Canvas.Handle, STRETCH_HALFTONE);
оно включит ресайз со сглаживанием (можешь в яндексе спросить про бикубический ресайз, Lanczos/Mitchell), однако будет некоторое "мыло"


 
Jeer ©   (2010-01-07 16:36) [6]


> antonn ©   (07.01.10 15:45) [5]
> еще один оригинал %)


О чем это ?

Если человек не понимает, что масштабирование растра "вниз" (тем более - значительное) приводит к потере информации, то не мешает ему лишний раз напомнить об органе, ответственном за мышление.


 
antonn ©   (2010-01-07 16:44) [7]

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


 
DVM ©   (2010-01-07 16:57) [8]

Тонкие линии толщиной менее пиксела обычно рисуются до некоторого предела другим цветом того же тона, хотя это вот уже непросто. Свой механизм вывода графических примитивов нужен. GDI так не умеет.


 
Jeer ©   (2010-01-07 17:10) [9]


> мог бы подкинуть идею о "ресемплинге со сглаживанием", векторные
> редакторы такие векторные, но они рисуют себя на растре,
>


Ресемплинг со сглаживанием был создан для "семплинга" вверх, а не вниз. Ферштейн ?
И при чем тут ссылка на векторы ? Они могут рисовать на чем угодно, поскольку в основе не пиксели, а координаты опорных точек.


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

> Понимать как: 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 раза (чем мыло), но все равно при огромных битмапах тормозит заметно, от чего делается неприятно.. и пользователю потом будет не особо приятно..

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

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


 
Anatoly Podgoretsky ©   (2010-01-07 17:58) [11]

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

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


 
Anatoly Podgoretsky ©   (2010-01-07 17:59) [12]

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

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


 
antonn ©   (2010-01-07 18:01) [13]


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

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


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

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


 
Anatoly Podgoretsky ©   (2010-01-07 18:02) [14]


> V   (07.01.10 17:50) [10]

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


 
antonn ©   (2010-01-07 18:04) [15]


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

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


 
Jeer ©   (2010-01-07 18:29) [16]

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

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

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


 
DVM ©   (2010-01-07 18:34) [17]

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


> V

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

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


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


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

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


 
Jeer ©   (2010-01-07 18:45) [19]


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


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

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

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


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


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

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


 
Jeer ©   (2010-01-07 19:02) [21]

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

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


 
DVM ©   (2010-01-07 19:20) [22]


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


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

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


 
antonn ©   (2010-01-07 19:22) [23]

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


 
Anatoly Podgoretsky ©   (2010-01-07 19:28) [24]

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

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


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


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

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


 
Sunktor ©   (2010-01-07 19:52) [26]

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


 
DVM ©   (2010-01-07 20:01) [27]


> Sunktor ©  


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

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


 
Anatoly Podgoretsky ©   (2010-01-07 20:15) [28]

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

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


 
Palladin ©   (2010-01-07 20:50) [29]

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


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


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


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


 
Jeer ©   (2010-01-07 21:34) [31]

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


 
Jeer ©   (2010-01-07 23:05) [32]

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


 
Anatoly Podgoretsky ©   (2010-01-07 23:11) [33]

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


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

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


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

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


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


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

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


 
Демо ©   (2010-01-08 02:51) [37]


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


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


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


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


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

???


 
antonn ©   (2010-01-08 09:23) [39]


> ???

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


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


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

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

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

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
2-1261502981
Aleks
2009-12-22 20:29
2010.03.14
Sql ошибка при выборки из за ковычек Майка " синяя"


15-1261697289
DillerXX
2009-12-25 02:28
2010.03.14
А не вспомнит ли кто...


15-1261953438
Делфиец
2009-12-28 01:37
2010.03.14
Хочу давно "О чем не пишут в книгах по Delphi" почитать


2-1262902311
dis12345
2010-01-08 01:11
2010.03.14
скрыть панель задач


2-1262964582
Иван
2010-01-08 18:29
2010.03.14
Количество записей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский