我們在浏覽網頁時見過不少圖像淡入淡出的特技,其實,用Delphi也可以實現這樣的效果。
用Delphi顯示圖像,有兩個不可缺少的步驟,一是將圖像裝入Delphi隱形控件TBitmap中,二是用Canvas(畫布)的Draw(x,y,Bitmap)或StretchDraw(Rect,Bitmap)方法將圖像顯示出來。淡出的效果就是將圖像上每一個像素的顏色值進行設置,使它逐漸減少到0(黑色),實現圖像的漸漸隱去。利用Canvas的Scanline屬性可讀取和設置圖像每一行的像素顏色,我們就是利用它來實現特技的。淡入則是將一幅圖像裝入兩個TBitmap對象,一個用來保存原始顏色,另一個用來處理,將像素的顏色從0逐漸遞增到原始圖的顏色,實現淡入的效果。
准備工作:新建一個窗體並加入一個Image控件(用來顯示圖像特技),兩個Button控件(用來切換淡入淡出)。下面我們將兩個Button的Click事件源碼介紹如下:
unit drdc;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R .DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,i:integer;
Bitmap:TBitmap;
pixcolo:PByteArray;
begin
Bitmap:=TBitmap.Create;
//創建TBitMap實例
try
Bitmap.LoadFromFile
(c:windowsclouds.bmp);
Bitmap.PixelFormat:=pf24bit;
for i:=0 to 255 do
begin
for y:=0 to Bitmap.Height-1 do
begin
pixcolo:=Bitmap.Scanline[y];
//掃描每行像素顏色
for x:=0 to ((Bitmap.Width3)-1) do
if pixcolo[x]>0 then pixcolo[x]:=(pixcolo[x]-1);
//遞減顏色值,不同的遞減值可改變不同的速度
end;
Image1.Canvas.Draw(0,0,Bitmap);
//畫出圖像
Application.ProcessMessages;
//系統做其他工作
end;
finally
Bitmap.free; //釋放位圖
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
x,y,i,j:integer;
Bitmap1,Bitmap2:TBitmap;
pixcolo1,pixcolo2:PByteArray;
begin
Bitmap1:=TBitmap.Create;
Bitmap2:=TBitmap.Create;
try
Bitmap1.LoadFromFile(c:windowsclouds.bmp);
//將同一幅圖像裝入兩個TBitmap實例
Bitmap2.LoadFromFile(c:windowsclouds.bmp);
Bitmap1.pixelFormat:=pf24bit;
Bitmap2.pixelFormat:=pf24bit;
for y:=0 to Bitmap2.height-1 do
begin
pixcolo2:=Bitmap2.Scanline[y];
for x:=0 to ((Bitmap2.Width3)-1) do
pixcolo2[x]:=0;
//先將要處理的圖像的像素顏色值設為0
end;
for i:=0 to 255 do
begin
for y:=0 to Bitmap2.Height-1 do
begin
pixcolo2:=Bitmap2.Scanline[y];
pixcolo1:=Bitmap1.Scanline[y];
for x:=0 to ((Bitmap2.Width3)-1) do if pixcolo2[x]<pixcolo1[x] then pixcolo2[x]:=(pixcolo2[x]+1);
end;
//與原始圖的像素顏色值比較,並遞增其值直到與原始圖相等
Image1.Canvas.Draw(0,0,Bitmap2);
Application.ProcessMessages;
end;
finally
Bitmap1.free
end;
end;
end.
利用上面的程序,我們就在Delphi中初步實現了圖像的淡入淡出效果。