![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Умный алгоритм ;уменьшения картинки.
Blacki © (2002-07-30 12:40:00)Подскажите пожалуйста хороший алгоритм уменьшения картинки, чтобы он был быстрый, и качество было не намного хуже фотошоповского.
Dmk (2002-07-31 01:34:00) [1]Еще есть для 8 бит :)
Dmk (2002-07-31 00:55:00) [2]А вот тебе еще один только для 1 битных картинок. Правда без MMX. Сам перепишешь. :)
Function Scale_x2_Bicubic_1(NewData:fgInfo):fgInfo;
var
EndX,EndY: DWord;
x,y: DWord;
DestLine: DWord;
ScaledStartOffs: DWord;
SourcePos: DWord;
SourceOffs: DWord;
DoubleWidth: DWord;
LineLenOfDIB: DWord;
begin
EndX := NewData.fgWidth shr 3 - 1;
EndY := NewData.fgHeight - 1;
LineLenOfDIB := NewData.fgRealImageWidth shr 3;
DoubleWidth := LineLenOfDIB shl 1;
SourcePos := NewData.fgAddress;
DestLine := NewData.fgAddress;
ScaledStartOffs := NewData.fgAddress;
//..
For y := 0 to EndY do
begin
SourceOffs := 0;
For x := 0 to EndX do
begin
asm
push esi
push edi
push ebx
mov esi,SourcePos
add esi,SourceOffs
xor bx,bx
Lodsw
xchg al,ah
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
shld bx,ax,1
rol ax,2
add SourceOffs,2
mov edx,DestLine
mov [edx],bx
add DestLine,1
pop ebx
pop edi
pop esi
end;
end;
ScaledStartOffs := ScaledStartOffs + LineLenOfDIB;
DestLine := ScaledStartOffs;
Inc(SourcePos, DoubleWidth);
end;
//....
Result := NewData;
end;
Dmk (2002-07-30 23:27:00) [3]На тебе алгоритм уменьшения. Писал сам, ни у кого не содрал.
Уменьшает ровно в 2 раза. В 1.5 раза шустрее Shop"a. Ето смотря как ты его применишь.
Работает правда только для 32-ух бит.
Function Scale_x2_Bicubic_32_MMX(const NewData:fgInfo):fgInfo;
var EndX,EndY:LongWord;
yy:integer;
//...
DestLine:LongWord;
SourcePos:LongWord;
SourceOffs:LongWord;
DoubleWidth:LongWord;
AddonWidth:LongWord;
LineLenOfDIB:LongWord;
ScaledStartOffs:LongWord;
begin
EndY := NewData.fgHeight-1;
EndX := NewData.fgWidth;
LineLenOfDIB := NewData.fgScanLineLength;
AddonWidth := NewData.fgScanLineLength;
DoubleWidth := NewData.fgScanLineLength * 2; //
Jeer (2002-07-30 23:10:00) [4]>и качество было не намного хуже
На сколько и как это оценивать будем ?
nick_sniper (2002-07-30 22:22:00) [5]Здесь есть прекрасній алгоритм, но придется покопаться в исходниках:
http://g32.org/g32/index.html
Dmitry Toropov (2002-07-30 13:39:00) [6]TImage
Stretch:=true;
Skier (2002-07-30 12:43:00) [7]>Blacki
Обратись к разработчикам Фотошопа.
Они тебе обязательнопомогут.
Opuhshii (2002-07-30 12:43:00) [8]"уменьшения картинки"?
геометрия (размеры высота - ширина) или размер данных,.?