myamanda

博客园 首页 新随笔 联系 订阅 管理

图像渐隐在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.

posted on 2009-08-19 10:16  myamanda  阅读(283)  评论(0编辑  收藏  举报