明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

WINDOWS基于調(diào)色板的圖像消隱

[摘要]圖像漸隱在Windows的多媒體程序設(shè)計中是一種常用的技術(shù),主要用來制作程序片頭或者多幅圖像之間的切換等。利用圖像漸隱技術(shù)可以使程序具有動畫效果,從而增添程序的魅力。圖像漸隱實現(xiàn)的方法很多,例如利用調(diào)色板以及利用光柵映射模式等,而調(diào)色板方法無疑是其中最快速的一種。需要指出的是,這種方法只能在基于調(diào)...
    圖像漸隱在Windows的多媒體程序設(shè)計中是一種常用的技術(shù),主要用來制作程序片頭或者多幅圖像之間的切換等。利用圖像漸隱技術(shù)可以使程序具有動畫效果,從而增添程序的魅力。
圖像漸隱實現(xiàn)的方法很多,例如利用調(diào)色板以及利用光柵映射模式等,而調(diào)色板方法無疑是其中最快速的一種。需要指出的是,這種方法只能在基于調(diào)色板的顯示模式下工作。在Windows的顯示模式中,只有256色模式是基于調(diào)色板的,這種模式是多媒體程序經(jīng)常采用的。
    在基于調(diào)色板的256色模式下,當一幅圖像顯示時,Windows把圖像的邏輯調(diào)色板載入,并通過調(diào)色板映射把邏輯調(diào)色板映射到系統(tǒng)調(diào)色板,圖像的每一像素的顯示顏色都映射自系統(tǒng)調(diào)色板的一個顏色索引值,每個索引對應(yīng)一個24位的RGB全彩色值。當系統(tǒng)調(diào)色板改變時,當前引用系統(tǒng)調(diào)色板的窗口的像素顏色也隨之改變,而這種改變是系統(tǒng)在硬件刷屏中自動完成的,速度極快,這樣就為我們利用調(diào)色板實現(xiàn)圖像的動畫漸隱提供了引擎。實際上,利用這種技術(shù)可以實現(xiàn)多種動畫效果,圖像漸隱只是其中的一種。
    在下面的例子中,首先在窗口的黑色背景上顯示一幅256色的DIB圖像,然后在系統(tǒng)時鐘消息進程中動態(tài)地修改圖像的邏輯調(diào)色板的顏色值,使每一個顏色值逐漸向背景顏色值趨近,漸隱的速度可以用時鐘的時間片間隔來控制。當漸隱開始時,可以看到整幅圖像逐漸變暗,最后消失在黑色的背景中,整個過程十分平滑,就如你在電影片頭中看到的一樣。
本例用Delphi 1.0在Windows 3.2下實現(xiàn),下面給出程序的主要部分及注釋。

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;{時鐘構(gòu)件}
Panel1:TPanel;{顯示漸隱過程,已漸隱為背景色的顏色數(shù)}
Button1:TButton;{開始漸隱按鈕}
procedure Timer1 Timer(Sender:TObject);{始終控制過程}
procedure Button1 Click (Sender:TObject);{激發(fā)漸隱過程}
procedure FormCreate (Sender:TObject);{窗體構(gòu)造過程}
private
PalDevice:Imteger;{調(diào)色板模式標志}
go:integer;{漸隱開始標志}
pal:arrar[0...255] of TPaletteEntry;{邏輯調(diào)色板}
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{調(diào)色板顏色值遞減}
begin

pal[i].peFlags:=PC-RESERVED;{調(diào)色板動畫標志,一定得這樣設(shè)置}
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);
{設(shè)置新的顏色到DIB調(diào)色板}
RealizePalette(Image1.Picture.Bitmap.Canvas.Handle);
{影射邏輯調(diào)色板到系統(tǒng)硬件調(diào)色板}
{計算已經(jīng)漸隱消失的顏色數(shù),如全數(shù)完成則終止?jié)u隱過程,令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圖像的調(diào)色板}
{判斷系統(tǒng)是否是基于調(diào)色板的顯示模式,如果是則開始漸隱過程}
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.