最近在整理代码的时候发现了这个函数,但是原作者是谁我已经不知道了,修正了里面的一个bug,然后把alpha修改为0-255个级别!(原来为10)
1
procedure
DrawAlpha(bmpBack, bmpFore : TBitmap; TransColor : TColor; OffX, OffY : Integer; Alpha : Integer);
2
3 type
4 TRGBArray = array [ 0 .. 32767 ] of TRGBTriple;
5 PRGBArray = ^TRGBArray;
6
7 var
8 X, Y : Integer;
9 rowFore,
10 rowBack : PRGBArray;
11
12 begin
13 // check bitmaps
14 if not Assigned(bmpBack) or
15 not Assigned(bmpFore) then
16 Exit;
17
18 // check color depth
19 if (bmpFore.PixelFormat <> pf24bit) or
20 (bmpBack.PixelFormat <> pf24bit) then
21 Exit;
22
23 // check dimensions
24 // if (bmpFore.Height + OffY > bmpBack.Height) or
25 // (bmpFore.Width + OffX > bmpBack.Width) then
26 // Exit;
27
28 // check alpha value
29 if (Alpha > 255 ) or
30 (Alpha < 0 ) then
31 Alpha : = 255 ;
32
33 for y : = 0 to bmpFore.Height - 1 do
34 begin
35 // scan bitmap rows
36 if (y > bmpBack.Width) then
37 Continue;
38 rowBack : = bmpBack.ScanLine[y + OffY];
39 rowFore : = bmpFore.ScanLine[y];
40 for x : = 0 to bmpFore.Width - 1 do
41 begin
42 if (x + offx > bmpBack.Width) then
43 Continue;
44 // if not transparent color
45 if not ((rowFore[x].rgbtRed = GetRValue(TransColor)) and
46 (rowFore[x].rgbtGreen = GetGValue(TransColor)) and
47 (rowFore[x].rgbtBlue = GetBValue(TransColor))) then
48 // calculate new pixel value
49 begin
50 rowBack[x + OffX].rgbtRed : = ((rowBack[x + OffX].rgbtRed * ( 255 - Alpha)) + (rowFore[x].rgbtRed * abs(Alpha - 255 ))) div 255 ;
51 rowBack[x + OffX].rgbtGreen : = ((rowBack[x + OffX].rgbtGreen) * ( 255 - Alpha) + (rowFore[x].rgbtGreen * Abs(Alpha - 255 ))) div 255 ;
52 rowBack[x + OffX].rgbtBlue : = ((rowBack[x + OffX].rgbtBlue) * ( 255 - Alpha) + (rowFore[x].rgbtBlue * Abs(Alpha - 255 ))) div 255 ;
53 end ;
54 end ;
55 end ;
56 end ;
2
3 type
4 TRGBArray = array [ 0 .. 32767 ] of TRGBTriple;
5 PRGBArray = ^TRGBArray;
6
7 var
8 X, Y : Integer;
9 rowFore,
10 rowBack : PRGBArray;
11
12 begin
13 // check bitmaps
14 if not Assigned(bmpBack) or
15 not Assigned(bmpFore) then
16 Exit;
17
18 // check color depth
19 if (bmpFore.PixelFormat <> pf24bit) or
20 (bmpBack.PixelFormat <> pf24bit) then
21 Exit;
22
23 // check dimensions
24 // if (bmpFore.Height + OffY > bmpBack.Height) or
25 // (bmpFore.Width + OffX > bmpBack.Width) then
26 // Exit;
27
28 // check alpha value
29 if (Alpha > 255 ) or
30 (Alpha < 0 ) then
31 Alpha : = 255 ;
32
33 for y : = 0 to bmpFore.Height - 1 do
34 begin
35 // scan bitmap rows
36 if (y > bmpBack.Width) then
37 Continue;
38 rowBack : = bmpBack.ScanLine[y + OffY];
39 rowFore : = bmpFore.ScanLine[y];
40 for x : = 0 to bmpFore.Width - 1 do
41 begin
42 if (x + offx > bmpBack.Width) then
43 Continue;
44 // if not transparent color
45 if not ((rowFore[x].rgbtRed = GetRValue(TransColor)) and
46 (rowFore[x].rgbtGreen = GetGValue(TransColor)) and
47 (rowFore[x].rgbtBlue = GetBValue(TransColor))) then
48 // calculate new pixel value
49 begin
50 rowBack[x + OffX].rgbtRed : = ((rowBack[x + OffX].rgbtRed * ( 255 - Alpha)) + (rowFore[x].rgbtRed * abs(Alpha - 255 ))) div 255 ;
51 rowBack[x + OffX].rgbtGreen : = ((rowBack[x + OffX].rgbtGreen) * ( 255 - Alpha) + (rowFore[x].rgbtGreen * Abs(Alpha - 255 ))) div 255 ;
52 rowBack[x + OffX].rgbtBlue : = ((rowBack[x + OffX].rgbtBlue) * ( 255 - Alpha) + (rowFore[x].rgbtBlue * Abs(Alpha - 255 ))) div 255 ;
53 end ;
54 end ;
55 end ;
56 end ;
下面的是使用的例子
1
procedure
TForm1.Button2Click(Sender: TObject);
2 begin
3 // set color depth to 16 .7mio colors ( 24 bit)
4 // because the loaded bitmaps are 8 bit
5 img1.Picture.Bitmap.PixelFormat : = pf24bit;
6 img2.Picture.Bitmap.PixelFormat : = pf24bit;
7
8 DrawAlpha(img1.Picture.Bitmap, img2.Picture.Bitmap, clFuchsia, 10 , 10 , 5 );
9
10 // update image1 (result)
11 img1.Invalidate;
12 end ;
2 begin
3 // set color depth to 16 .7mio colors ( 24 bit)
4 // because the loaded bitmaps are 8 bit
5 img1.Picture.Bitmap.PixelFormat : = pf24bit;
6 img2.Picture.Bitmap.PixelFormat : = pf24bit;
7
8 DrawAlpha(img1.Picture.Bitmap, img2.Picture.Bitmap, clFuchsia, 10 , 10 , 5 );
9
10 // update image1 (result)
11 img1.Invalidate;
12 end ;