荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Minatl (Minatl), 信区: Program
标  题: delphi图像渐隐
发信站: BBS 荔园晨风站 (Wed Jan 20 19:22:48 1999), 转信

    图像渐隐在Windows的多媒体程序设计中是一种常用的技术,主要用来制作程序片头或
者多幅图像之间的切换等。利用图像渐隐技术可以使程序具有动画效果,从而增添程序的魅
力。
图像渐隐实现的方法很多,例如利用调色板以及利用光栅映射模式等,而调色板方法无疑是
其中最快速的一种。需要指出的是,这种方法只能在基于调色板的显示模式下工作。在
Windows的显示模式中,只有256色模式是基于调色板的,这种模式是多媒体程序经常采用的
。
在基于调色板的256色模式下,当一幅图像显示时,Windows把图像的逻辑调色板载入,并通
过调色板映射把逻辑调色板映射到系统调色板,图像的每一像素的显示颜色都映射自系统调
色板的一个颜色索引值,每个索引对应一个24位的RGB全彩色值。当系统调色板改变时,当
前引用系统调色?
宓拇翱诘南袼匮丈菜嬷谋洌庵指谋涫窍低吃谟布⑵林凶远瓿傻模俣燃欤
庋臀颐抢玫魃迨迪滞枷竦亩ヒ峁┝艘妗J导噬希谜庵旨际蹩梢允迪侄
嘀侄Ч枷窠ヒ皇瞧渲械囊恢帧*?
在下面的例子中,首先在窗口的黑色背景上显示一幅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;〖ZK)〗
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.

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.240]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店