Форум: "Media";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизИнтерполяция изображения Найти похожие ветки
← →
AlexTregubov © (2004-03-05 09:55) [0]Мастера! Может кто подскажет, как быстро увеличить размер изображения.
Заранее спасибо
← →
Mantic0re (2004-03-05 10:15) [1]Используй билинейную интерполяцию..
Нормальные исходники на асме в VirtualDub.
Гугл тебе в помощь =)
← →
AlexTregubov © (2004-03-05 14:45) [2]Если можно, немного поподробней. Если можно, то с кодом.
Исходники я нашел, но в асме не силен. Где смотреть - в файле A_bitmap.asm _asm_resize_bilinear?
← →
MBo © (2004-03-05 15:29) [3]Возможно, устроит простое StretchBlt (на Nt-семействе -со SetStretchbltMode HALFTONE)
← →
AlexTregubov © (2004-03-05 15:54) [4]Нет, последнее не подходит по качеству.
Алгоритм на Delphi написан, но не устраивает скорость.
Надо, чтобы было быстро
← →
Opilki_Inside © (2004-03-07 16:58) [5]2AlexTregubov:
увеличивать всегда на один и тот же размер?
тогда часть расчетов можно сделать заранее и загнать в массив
← →
Mantic0re (2004-03-09 11:17) [6]Да, можно и из A_bitmap.asm, только когда откомпилишь тасмом (5.3 , чтоб ММХ понимал) полученный OBJ прилинкуешь и объявишь функции как stdcall (параметры сохраняются в стэке), и после каждого вызова мне приходилось делать:
asm
add esp, $10
end;
потому что в исходнике параметры извлекаются из стека, а esp не восстанавливается..
← →
AlexTregubov © (2004-03-10 09:01) [7]ManticOre, а не могли бы вы еще объяснить назначение параметров этой процедуры (_asm_resize_bilinear) ?
← →
Mantic0re (2004-03-10 10:12) [8]А там же всё написано:
(+ объяснения параметров, как я их понимаю)
;asm_resize_bilinear(
; [esp+ 4] void *dst, - конечный буфер + смещение на ширину строки (например dword(DstPointer)+Width*4 для pf32bit)
; [esp+ 8] void *src, - исходный буфер картинки
; [esp+12] ulong w, - ширина
; [esp+16] ulong h, - высота
; [esp+20] ulong dstpitch, - шаг для конечного буфера (наверно, если у тебя pf24bit - то будет 1)
; [esp+24] ulong srcpitch, - шаг для исходного буфера
; [esp+28] ulong xaccum, - дополнительная точность для коэф. масштабирования по Х
; [esp+32] ulong yaccum, -//- У
; [esp+36] ulong xfrac, - дробная часть коэффициента масштабирования для Х
; [esp+40] ulong yfrac, - .. У
; [esp+44] long xint, - целая ..
; [esp+48] long yint, -..
; [esp+52] void *srcprecopy, - буфер "предкопии" можно задать 0
; [esp+56] ulong xprecopy, - //- похоже на смещение
; [esp+60] void *srcpostcopy, -//- "посткопии"
; [esp+64] ulong xpostcopy); -//-
А вообще посмотри как функция используется в исходниках. Я оттуда и выводы делал.
Все ОК, когда размеры начального и конечного буфера одинаковы.
У меня получилось только увеличение картинки, с уменьшением - пошли глюки - надо уточнить параметры..
Простой пример:
.......
var
CoefX, CoefY : Int64;
.......
begin
.......
coefx := round(1/(2*(int64(1) shl 32))); // увеличим картинку в 2 раза
coefy := round(1/(2*(int64(1) shl 32))); //
_asm_resize_bilinear(dword(DstBuf)+ScrX*4, dword(SrcBuf), -ScrX*4, ScrY, ScrX*4, ScrX*4, 0, 0, coefx and $ffffffff, coefy and $ffffffff, coefx shr 32, coefy shr 32, 0,0,0,0);
asm add esp, $40 end;
BitBlt(WindowDC, 0, 0, ImgW, ImgH, PictureDC, 0, 0, SRCCOPY);
..........
← →
AlexTregubov © (2004-03-10 11:04) [9]Спасибо большое!!!
← →
NoName (2004-05-12 11:10) [10]В WinApi есть удобная функция StretchBlt
иногда она даже использует возможности видеокарты
Разобраться с ней не особо сложно, в хелпе WinSDK все хорошо
описанно.
Единственное немного нестандартный для визуального программирования подход через THandle на ресурс и на приемник.
Я думаю разберешся.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c