我們知道,GIF 類型的圖像格式支持透明顯示,而BMP 類型的圖像格式不支持透明顯示。在Microsoft 照片編輯器中位圖若以設置成透明色方式存儲,則提示出錯。然而,在C ++Builder 中,卻可以輕而易舉地顯示透明位圖。透明位圖與透明GIF 圖像相比有一個很大的優點,即:GIF 圖像格式最大支持256 種顏色,位圖卻可以支持真彩色。
在C ++Builder 中顯示透明位圖
1. 采用TImage 組件。
下面,我們制作一幅飛機凌空飛過藍天的簡單動畫。因為移動的飛機是用透明位圖顯示的,所以看起來挺逼真的。
(1) 在C ++Builder 下激活菜單"File /New Application" 創建一個新工程,窗體單元以文件planemain.cpp 存盤,工程文件以plane.cpp 存盤。
(2) 在Form1 窗體上新增一個TButton 組件Button1,
新增一個TTimer 組件Timer1,新增三個TImage 組件Image1、Image2 和Image3,新增一個TLabel。
(3) 在窗體上雙擊Image1,調入藍天的位圖BlueSky.bmp, 設置其Transpartant 屬性為false,即為不透明,作為背景;雙擊Image2,調入飛機的位圖Plane.bmp, 設置其Transparent 屬性為true,即為透明,Autosize 屬性為true,把Image2 放在Image1 上面。此時可以看出,飛機已經融入藍天中。作為對比,雙擊Image3,調入飛機的位圖Plane.bmp, 設置其Transparent 屬性為false,即為不透明,Autosize 屬性為true。設置Label1 的Caption 屬性為" 源位圖"。設置Button1 的Caption 屬性為" 開始"。設置Timer1 的Enabled 屬性為false,Interval 屬性為100(決定飛機飛行的快慢,可調整)。
(4) Timer1 的OnTimer 事件控制飛機的移動,代碼如下:
void __fastcall TForm1::Timer1Timer
(TObject *Sender)
{Image2 ->Left=Image2 ->Left +1;}
Button1 的OnClick 事件啟動飛機,代碼如下:
void __fastcall TForm1::Button1Click
(TObject *Sender)
{Timer1 ->Enabled=true;}
下圖是程序的運行結果:
2. 直接從文件中調入位圖,然后畫在屏幕上。這種方法靈活,且占用內存少。繼續上面的程序設計:
(1) 在窗體上新增一個TButton 組件Button2,設置其Caption 屬性為" 顯示透明位圖"。
(2) Button2 的OnClick 事件顯示透明的位圖,代碼如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
// 單擊" 顯示透明位圖" 按鈕時進入
{
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
try
{pBitmap ->LoadFromFile("Plane.bmp");
//調入位圖
pBitmap ->Transparent = true;
//設置透明屬性
pBitmap ->TransparentColor=
pBitmap ->Canvas ->Pixels[2][2];
?。瘡奈粓D上取得要設置成的
透明顏色, 也可以直接給出
Form1 ->Canvas ->Draw(10,20,pBitmap);
?。疉A
?。诖绑w上顯示透明位圖,
沒有設置TransparentMode
?。晕粓D[2][2] 處的像素的顏色為透明色
pBitmap ->TransparentMode = tmAuto;
//設置透明模式, tmAuto:
TransparentColor 屬性返回位
//圖最左下角像素的顏色, 作為透明色;
?。痶mFixed: TransparentColor 屬性返回位圖
上某一像素的顏色, 作為透明色。
Form1 ->Canvas ->Draw(10,100,pBitmap);
//BB
//在窗體上顯示透明位圖,
與AA 行有所不同
//以位圖最左下角的像素的顏色為透明色
Image1 ->Canvas ->Draw(30,20,pBitmap);
//在背景位圖上顯示透明位圖
}
catch (...)
{
ShowMessage(" 不能調入或顯示位圖!");
//顯示出錯信息
}
delete pBitmap;?。瘎h除對像
}
應用這種方法進行圖像合成時,背景圖像要求是位圖,并且透明位圖和背景位圖的顏色位數要盡量保持一致,這樣,位圖的顏色才不會改變。
另外,我們利用TImageList 組件也可以顯示透明圖像,利用TCanvas 類的BrushCopy 方法可以實現被拷貝圖像的部分透明。
以上程序在WIN 98 和C ++Builder3 下調試通過。