图像渐隐在Windows的多媒体程序设计中是一种常用的技术,主要用来制作程序片头或者多幅图像之间的切换等。利用图像渐隐技术可以使程序具有动画效果,从而增添程序的魅力。 图像渐隐实现的方法很多,例如利用调色板以及利用光栅映射模式等,而调色板方法无疑是其中最快速的一种。需要指出的是,这种方法只能在基于调色板的显示模式下工作。在Windows的显示模式中,只有256色模式是基于调色板的,这种模式是多媒体程序经常采用的。 在基于调色板的256色模式下,当一幅图像显示时,Windows把图像的逻辑调色板载入,并通过调色板映射把逻辑调色板映射到系统调色板,图像的每一像素的显示颜色都映射自系统调色板的一个颜色索引值,每个索引对应一个24位的RGB全彩色值。当系统调色板改变时,当前引用系统调色板的窗口的像素颜色也随之改变,而这种改变是系统在硬件刷屏中自动完成的,速度极快,这样就为我们利用调色板实现图像的动画渐隐提供了引擎。实际上,利用这种技术可以实现多种动画效果,图像渐隐只是其中的一种。 在下面的例子中,首先在窗口的黑色背景上显示一幅256色的DIB图像,然后在系统时钟消息进程中动态地修改图像的逻辑调色板的颜色值,使每一个颜色值逐渐向背景颜色值趋近,渐隐的速度可以用时钟的时间片间隔来控制。当渐隐开始时,可以看到整幅图像逐渐变暗,最后消失在黑色的背景中,整个过程十分平滑,就如你在电影片头中看到的一样。 本例用Delphi 1.0在Windows 3.2下实现,下面给出程序的主要部分及注释。
unit Bmp-Disaper; interface uses SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,Controls,Forms,Dialogs,Ex tCtrls,StdCtrls; type TForm1=class(TForm) Image1:TImage;{显示渐隐图像} Timer1:TTimer;{时钟构件} Panel1:TPanel;{显示渐隐过程,已渐隐为背景色的颜色数} Button1:TButton;{开始渐隐按钮} procedure Timer1 Timer(Sender:TObject);{始终控制过程} procedure Button1 Click (Sender:TObject);{激发渐隐过程} procedure FormCreate (Sender:TObject);{窗体构造过程} private PalDevice:Imteger;{调色板模式标志} go:integer;{渐隐开始标志} pal:arrar[0...255] of TPaletteEntry;{逻辑调色板} end; var Form1:TForm1;
implementation {$R *.DFM} procedure TForm1.Timer1Timer(Sender:TObject); var i,n:integer; begin if go=1 then{开始渐隐} begin for i:=0 to 255 do{调色板颜色值递减} begin
pal[i].peFlags:=PC-RESERVED;{调色板动画标志,一定得这样设置} if pal[i].peRed>0 thenpal[i].peRed:=pal[i].peRed-1; if pal[i].peGreen>0 thenpal[i].peGreen:=pal[i].peGreen-1; if pal[i].peBlue>0 thenpal[i].peBlue:=pal[i].peBlue-1; end; SetPaletteEntries(Image1.Picture.Bitmap.Palette,0,256,pal); {设置新的颜色到DIB调色板} RealizePalette(Image1.Picture.Bitmap.Canvas.Handle); {影射逻辑调色板到系统硬件调色板} {计算已经渐隐消失的颜色数,如全数完成则终止渐隐过程,令go=0} n:=0; for i:=0 to 255 do if(pal[i].peRed=0) and (pal[i].peGreen=0) and (pal[i].peBlue=0) then n:=n+1 if n=256 then begin Panel1.Caption:=’OK’; go:=0; end else Panel1.Caption:=’n=’+IntToStr(n); end; end; procedure TForm1.Button1Click(Sender:TObject); begin GetPaletteEntries(Image1.Pictrue.Bitmap.Palette,0,256,pal); {获得DIB图像的调色板} {判断系统是否是基于调色板的显示模式,如果是则开始渐隐过程} PalDevice:=GetDeviceCaps(Canvas.Handle,RASTERCAPS) and RC-PALETTE; if(PalDevice>0) the go:=1; end; procedure TForm1.FormCreate(Sender:TObject); begin Image1.Pictrue.Bitmap.LoadFromFile(’c:\video10\ts.bmp’); {加载DIB图像} end; end.
|