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

Вниз

Визуальные эффекты для изображений: 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.033 c
4-1092644424
Dmitry_K
2004-08-16 12:20
2004.09.26
GetSaveFileName


1-1095067054
kukuikar
2004-09-13 13:17
2004.09.26
Как перехватить клики в IE?


14-1094452637
YurikGL
2004-09-06 10:37
2004.09.26
Файрволл и авторизация


1-1094819476
kand
2004-09-10 16:31
2004.09.26
Как сделать прогу, чтоб была без форм?


4-1091957232
Cara
2004-08-08 13:27
2004.09.26
Как узнать код Юникодовского символа?