Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1094572239
Klopan
2004-09-07 19:50
2004.09.26
Memo


1-1094837644
x_michael
2004-09-10 21:34
2004.09.26
У.М.Д. подскажите плз как получить непрямоугольную область


1-1094663936
Antonmm
2004-09-08 21:18
2004.09.26
Рисование на экране


14-1094725109
stud
2004-09-09 14:18
2004.09.26
хороший программист 1С


4-1091763988
Петр
2004-08-06 07:46
2004.09.26
ком-порт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский