Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Быстрый ресамплинг изображений   Найти похожие ветки 

 
badevlad ©   (2007-03-07 11:14) [0]

Кто какие знает алгоритмы быстрого ресамплинга битмапов? Я нашел несколько довольно неплохо работающих функций, но метод Lanczos, который у меня есть, работает очень медленно и оставляет артефакты (при небольшой степени сжатия на однотонном изображении появляются слабо видимые «клеточки»). Более быстрые и менее аккуратные алгоритмы страдают артефактами еще сильнее (ярко выраженные «клеточки»). Хорошо работает только билинейный метод, но этого мало.

Кто с этим сталкивался и может подсказать безглючные и быстро работающие алгоритмы? Нужен код на Delphi, чем больше вариантов, тем лучше.


 
Sapersky   (2007-03-07 14:01) [1]

Вы определитесь всё-таки, быстро нужно или качественно.
Если, например, требуется реалтайм, то вряд ли получится применить что-либо сложнее билинейной фильтрации. Хотя это зависит от размера картинок, предполагаемых системных требований и т.п.
Практически любые типы фильтров есть в FastLIB:
http://sourceforge.net/project/showfiles.php?group_id=173551
Артефактов (кроме тех, что присущи низкокачественным фильтрам) не замечал.
Если надо, у меня есть оптимизированный вариант сложных фильтров (SmoothResize), раза в 2 быстрее.


 
Сотрудник деканата   (2007-03-07 17:39) [2]

> Sapersky   (07.03.07 14:01) [1]
> Если надо, у меня есть оптимизированный вариант сложных
> фильтров (SmoothResize), раза в 2 быстрее.


Очень надо! Буду благодарен, если Вы поделитесь столь ценной вещью!


 
Sapersky   (2007-03-07 20:05) [3]

http://slil.ru/24043787


 
Сотрудник деканата   (2007-03-07 20:58) [4]

Круто! Спасибо большое.

А вот например код

     w := pw.w;
     If ForceOneCont then begin
       Inc(zr, w shr 1); Inc(zg, w shr 1); Inc(zb, w shr 1);
.....
....
       zr := (zr + (w shr 1)) div w;
       zg := (zg + (w shr 1)) div w;
       zb := (zb + (w shr 1)) div w;


почему бы сразу не присваивать

w := pw.w shr 1  ?

Или оптимизатор в Delphi сам с этим справляется?


 
Сотрудник деканата   (2007-03-07 21:00) [5]

Т.е. завести еще одну переменную

w := pw.w;
w1 := w shr 1;


и вместо w shr 1 использовать w1.


 
Sapersky   (2007-03-09 12:45) [6]

Оптимизатор справляется, хотя я на это не надеялся - просто shr сравнительно быстрая операция, и влияние двух лишних команд будет заметно только на очень простом коде, но не в том нагромождении, которое имеется в DoFilter.
Кстати, ускорение в основном достигнуто именно за счёт замены деления (div) сдвигом (можно переключиться на старый метод - ForceOneCont = False и почувствовать разницу) и использованием указателя (c := @Src.Pixels24[pw.pos, x];) вместо переменной.



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

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
1-1193959547
яблочго
2007-11-02 02:25
2008.02.10
Движение точки по окружности


15-1200080417
Черный Шаман
2008-01-11 22:40
2008.02.10
Билинейная или бикубическая фильтрация с учетом TransparentColor


1-1193770634
Gear
2007-10-30 21:57
2008.02.10
Как в Vista программно изменить уровень записи с микрофона?


2-1200407658
Nil
2008-01-15 17:34
2008.02.10
Освободить поток который находится в Suspend


2-1200304108
Washington
2008-01-14 12:48
2008.02.10
Перехват вызова контекстного меню