Форум: "Media";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизВизуальные эффекты для изображений: Colorize Найти похожие ветки
← →
Tahion2 (2004-07-03 13:30) [0]Мне нужна функция, которая бы накладывала цветовой фильтр на изображение: Colorize.
Все что мне удалось найтив интернете - это ф-ция из пакета GRAPH64. Она работает, но позволяет задать только пару комбинаций цветов (Красный, синий и зеленый факторы могут равняться только 0 или 1).
Помогите найти Colorize ф-цию, поддерживающую все RGB цвета или подскажите, как доработать эту?
Вот сама ф-ция:procedure TBitmap64.DrawColorize( x,y: Integer; b:TBitmap64; RFactor,GFactor,BFactor: Integer;Light:Byte);
{
Note: Factors are supported only ONE or ZERO!!!
}
var xx,yy: Longint;
s1,d1: PWord;
r: byte;
t: Word;
t1:Longint;
AndMask32,
StartX,StartY,
SizeX,SizeY: Longint;
AndMask16:Word;
begin
if (x >= Width) or ( x+b.Width<0) or (y>=Height) or ( y+b.Height<0) then exit;
if (X + b.Width) > Width then SizeX:= Width - x else SizeX:= b.Width;
if (Y + b.Height) > Height then SizeY:= Height - y else SizeY:= b.Height;
if X < 0 then
begin
StartX:= -x;
X:= 0;
end
else StartX:= 0;
if Y < 0 then
begin
StartY:= -y;
Y:= 0;
end
else StartY:= 0;
SizeX:= SizeX - StartX;
SizeY:= SizeY - StartY;
if (sizex<2)or(sizey<1) then exit;
AndMask16:= 0;
AndMask32:= 0;
case pixelformat of
pf15bit: AndMask16:= (RFactor*$7c00) or (GFactor*$3e0) or (BFactor*$1f);
pf16bit: AndMask16:= (RFactor*$f800) or (GFactor*$7e0) or (BFactor*$1f);
pf32bit: AndMask32:= (RFactor*$ff0000) or (GFactor*$ff00) or (BFactor*$ff);
end;
if (bmBitsPixel <> b. bmBitsPixel) then
begin
raise exception.create("Sorry, can""t ....");exit;
end;
if bmbpp=2 then //for 15/16 color"s
begin
if b.Transparent then
for yy:= 0 to SizeY-1 do
begin
s1:= b.PixelPtr[StartX, yy+Starty];
d1:= PixelPtr[x,yy+y];
xx:= SizeX-1;
r:= RStart-8;
t:= b.TransparentColor;
asm
push ebx
push edi
push esi
mov esi, s1
mov edi, d1
mov ebx, xx
@1:
//******** Pixel cycle ***********
mov ax, [esi] //get one pixel from buffer
cmp ax, t
jz @Skip
//separate all values into ah=Red, al=Green, dl=Blue
mov dl, al
and dl, BBitMask //now blue is in DL
mov cl, r
shr ax, cl //operate two pixels at once
shr al, 3 //al=Green , ah= Red
shl ax, 3 // convert into Intensity= G*4+R*4+B*16
shl dl, 4
// al= r
add al,ah // al= al+g
add al,dl // al= al+b
shr al, 3 //Intensity div 8
xor dx, dx
xor ah, ah
add al, light //some ligtness because effect isn"t perfect without this
cmp al, 31
jle @nothing
mov al, 31
@nothing:
mov dl, al //intensity into dl
add cl, 3 //pack intensity into 15/16 bpp (r,g,b=I)
shl dx, cl
or ax, dx
shl dx, 5
or ax, dx
and ax, AndMask16
mov [edi], ax
@Skip:
inc edi
inc edi
inc esi
inc esi
dec ebx
jnz @1
pop esi
pop edi
pop ebx
end;
end
else
for yy:= 0 to SizeY-1 do
begin
s1:= b.PixelPtr[StartX, yy+Starty];
d1:= PixelPtr[x,yy+y];
xx:= SizeX-1;
r:= RStart-8;
asm
push ebx
push edi
push esi
mov esi, s1
mov edi, d1
mov ebx, xx
@1:
mov ax, [esi]
mov dl, al
and dl, BBitMask
mov cl, r
shr ax, cl
shr al, 3
shl ax, 2
shl dl, 4
add al,ah
add al,dl
shr al, 3
xor dx, dx
xor ah, ah
mov dl, al
add al, light //some ligtness because effect isn"t perfect without this
cmp al, 31
jle @nothing
mov al, 31
@nothing:
add cl, 3
shl dx, cl
or ax, dx
shl dx, 5
or ax, dx
and ax, AndMask16
stosw
inc esi
inc esi
dec ebx
jnz @1
pop esi
pop edi
pop ebx
end;
end;
end;
if bmbpp=4 then //for 32 bit color"s
begin
if b.transparent then
for yy:= 0 to SizeY-1 do
begin
s1:= b.PixelPtr[StartX, yy+Starty];
d1:= PixelPtr[x,yy+y];
xx:= SizeX-1;
t1:= b.TransparentColor;
asm
push ebx
push edi
push esi
mov esi, s1
mov edi, d1
mov ebx, xx
@1:mov eax, [esi]
cmp eax, t1
jz @skip
xor edx, edx
shr eax, 1
and eax, 011111110111111101111111b
shr al, 6
mov dl, al
shr eax, 8
add dl, al
add dl, ah
xor eax,eax
add dl, light //some ligtness because effect isn"t perfect without this
cmp dl, 100
jle @nothing
mov dl, 100
@nothing:
mov al, dl
shl edx, 8
or eax, edx
shl edx, 8
or eax, edx
and eax, AndMask32
mov [edi], eax
@skip:
add edi, 4
add esi, 4
dec ebx
jnz @1
pop esi
pop edi
pop ebx
end;
end
else
for yy:= 0 to SizeY-1 do
begin
s1:= b.PixelPtr[StartX, yy+Starty];
d1:= PixelPtr[x,yy+y];
xx:= SizeX-1;
asm
push ebx
push edi
push esi
mov esi, s1
mov edi, d1
mov ebx, xx
@1:mov eax, [esi]
xor edx, edx
shr eax, 1
and eax, 011111110111111101111111b
shr al, 6
mov dl, al
shr eax, 8
add dl, al
add dl, ah
xor eax,eax
mov al, dl //in DL we have Intensity for all colors
add al, light //some ligtness because effect isn"t perfect without this
cmp al, 255
jle @nothing
mov al, 255
@nothing:
shl edx, 8
or eax, edx
shl edx, 8
or eax, edx
and eax, AndMask32
stosd
add esi, 4
dec ebx
jnz @1
pop esi
pop edi
pop ebx
end;
end
end;
end;
← →
TUser © (2004-07-03 15:01) [1]Я видел на DelphiWorld раздел про такие штуки. Особо правда в нем не копался, времени не было, равно как и непосредственной необходимости. + на алголисте есть очень неплохой учебник по графике. Наверное, есть смысл копать также на игроделательных сайтах.
← →
Tahion2 (2004-07-03 15:29) [2]DelphiWorld.com имел ввиду?
Ссылку на "алголист" дай пожалуйста
← →
Tahion2 (2004-07-03 17:48) [3]Продолжение темы тут:
http://delphimaster.net/view/8-1088847010/
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.033 c