![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наиболее быстро изменить размер Bitmap-а (уменьшить). [D7, WinXP]
DVM © (2006-11-21 10:11:00)Как наиболее быстро изменить размер Bitmap-а? Скорость стандартного StretchBlt не совсем устраивает. Можно ли обогнать StretchBlt и если да, то как?
Может кто занимался подобным. Можно ли привлечь для масштабирования SSE, MMX и прочие наборы инструкций? Если кто знает, расскажите как.
DVM (2006-11-21 14:15:00) [41]Для StretchBlt + HALFTONE - 1547 тиков.
DVM (2006-11-21 14:12:00) [42]
> StretchBlt требуется с фильтрацией или без?
Не фильтрация необязательна.
Т.е.
SetStretchBltMode(Canvas.Handle, COLORONCOLOR); Для StretchBlt
Вобщем я пришел к выводу, что не обогнать StretchBlt.
Попробовал и DrawDibDraw() и INTEL Image Processing Library - все медленнее, чем StretchBlt с COLORONCOLOR;
Результат для 100 повторов на некоторой картинке:
StretchBlt - 281 тиков
DrawDibDraw - 625 тиков (хотя это скорее подготовительные операции)
INTEL Image Processing Library - 844 (тоже подготовка дольше, чем обработка)
Sapersky (2006-11-21 13:39:00) [43]StretchBlt требуется с фильтрацией или без?
Если с фильтрацией, FastLIB'овский Bilinear быстрее, хотя и даёт несколько худшее качество (видимо, сам алгоритм проще). Если без (FastResize) - скорость примерно та же, что и у StretchBlt.
Насчёт единичных операций - да, от DDraw в такой ситуации будет мало пользы. Разве что хранить в том размере, который пришёл, и делать stretch непосредственно при выводе.
DVM (2006-11-21 13:00:00) [44]
> Но размер они меняют, что и требовалось в сабже.
Буквоедство это. В том же сабже указано StretchBlt. Речь о масштабировании. Русский язык богат и неоднозначен.
Думкин (2006-11-21 12:12:00) [45]
> DVM © (21.11.06 10:44) [9]
Но размер они меняют, что и требовалось в сабже.
atruhin (2006-11-21 11:46:00) [46]Посмотри GraphicEx, там несколько способов масшабирования, может будет быстрее.
DVM (2006-11-21 10:57:00) [47]
> clickmaker © (21.11.06 10:51) [11]
Не, ни о каком TImage речь не идет. Медленно и тяжеловесно.
> Barloggg (21.11.06 10:51) [10]
> Но если это единичная операция, то загрузка битмапа в поверхность,
> потом масштабирование, потом выгрузка обратно займет столько
> времени, что ни о каком ускорении и речи идти не может
У меня в огромном количестве образуются картинки (получаются по сети). Они не того размера, какой нужен. Размер надо преобразовывать и возможно их отображать потом. Это я так понимаю подпадает под определение "единичные операции"?
clickmaker (2006-11-21 10:51:00) [48]
> Только все же TBitmap.Width := ... и TBitmap.Height := не
> масштабируют - они обрезают лишнее
если через TImage и включено Strecth, то масштабируют
Barloggg (2006-11-21 10:51:00) [49]из под винды аппаратно ускоренный есть bltfast на прямом WinApi, но масштабирования он не держит.
к тому же там вагон параметров в типе TBltFx с поганой документацией.
так что да, директдрав. можно через ДельфиХ, можно через заголовочные файлы.
Но если это единичная операция, то загрузка битмапа в поверхность, потом масштабирование, потом выгрузка обратно займет столько времени, что ни о каком ускорении и речи идти не может...
DVM (2006-11-21 10:44:00) [50]
> KilkennyCat © (21.11.06 10:21) [2]
Только все же TBitmap.Width := ... и TBitmap.Height := не масштабируют - они обрезают лишнее. :)
DVM (2006-11-21 10:39:00) [51]
> KilkennyCat © (21.11.06 10:21) [2]
Неправ я. Оказалось чуть-чуть быстрее. Но настолько незначительнее, что овчинка выделки не стоит.
DVM (2006-11-21 10:37:00) [52]
> неправда. это
Я не смотрел реализацию TBitmap.Width := ... и TBitmap.Height := ... в VCL, но что-то мне подсказывает, что за ними скрывается то же StretchBlt :)
Это вряд ли быстрее.
KilkennyCat (2006-11-21 10:29:00) [53]> Это отсечение, а не масштабирование.
неправда. это
> наиболее быстро изменить размер Bitmap-а?
а если менять картинку, то зависит от алгоритма.
> Идеальным бы вариантом оказалось использование аппаратной
> поддержки со стороны видеоадаптера (он наврняка умеет, такая
> мощь простаивает). Но как этим воспользоваться?
DirectDraw... но не все видеокарты реализуют аппаратный StretchBlt.
WondeRu (2006-11-21 10:26:00) [54]http://rsdn.ru/forum/Message.aspx?mid=2201982тут обсуждается
DVM (2006-11-21 10:23:00) [55]
> clickmaker © (21.11.06 10:17) [1]
DirectDraw, сам по себе как мне кажется скорости не прибавит. Мне нужно просто масштабирование, без вывода на экран. Я с DD знаком мало, там есть функции масштабирования более быстрые, чем StretchBlt? Идеальным бы вариантом оказалось использование аппаратной поддержки со стороны видеоадаптера (он наврняка умеет, такая мощь простаивает). Но как этим воспользоваться?
DVM (2006-11-21 10:23:00) [56]
> KilkennyCat © (21.11.06 10:21) [2]
Это отсечение, а не масштабирование.
KilkennyCat (2006-11-21 10:21:00) [57]TBitmap.Width := ...
TBitmap.Height := ...
clickmaker (2006-11-21 10:17:00) [58]DirectDraw?