透明位圖 vs GIF
- GIF:僅支援 256 色、單一透明色、動畫。
- BMP (位圖):支援真彩色 (24/32-bit)、可設定任意顏色為透明色、**無專屬透明欄位**,靠應用層繪製時指定透明色實現。
方法一:TImage 控件 (設計期/靜態)
- 放置
TImage (背景) → Transparent = false。
- 放置另一
TImage (前景,如飛機) → Transparent = true、AutoSize = true、置於背景上層。
- 運行時移動前景
Image->Left/Top 即可產生透明動畫效果。
方法二:Canvas.Draw + TransparentColor/Mode (動態/靈活)
void __fastcall TForm1::btnDrawTransparentClick(TObject *Sender)
{
Graphics::TBitmap* bmp = new Graphics::TBitmap();
try {
bmp->LoadFromFile("Plane.bmp"); // 載入
bmp->Transparent = true; // 啟用透明
bmp->TransparentColor = bmp->Canvas->Pixels[2][2]; // 指定透明色 (取樣點)
// 或 bmp->TransparentMode = tmAuto; // 自動取左下角像素色
// 或 bmp->TransparentMode = tmFixed; // 使用 TransparentColor 屬性
Form1->Canvas->Draw(10, 20, bmp); // 繪到視窗
Form1->Canvas->Draw(10, 100, bmp); // 另一位置
Image1->Canvas->Draw(30, 20, bmp); // 繪到另一 TImage (背景)
} catch (...) {
ShowMessage("載入/繪製失敗");
}
delete bmp;
}
關鍵屬性詳解
| 屬性 | 說明 |
Transparent | Boolean,啟用/停用透明繪製。 |
TransparentColor | TColor,指定視為透明的 RGB 色值。 |
TransparentMode | tmAuto:繪製時自動取位圖左下角 (0, Height-1) 像素顏色作為透明色。
tmFixed:使用 TransparentColor 屬性值。 |
進階:TImageList + BrushCopy (部分透明)
TImageList 內建遮罩,支援每像素 Alpha (32-bit) 或 1-bit 遮罩。
Canvas->BrushCopy(Rect, ImageList, Index, clNone) 可繪製透明圖示。
- 適合工具列、樹狀視圖、列表視圖圖示。
合成建議
- 背景圖**必須為位圖** (或先轉為位圖),否則色彩匹配會導致邊緣雜色。
- 前景透明圖與背景圖 **色深一致** (同為 24-bit 或 32-bit),避免色彩截斷。
- 大量合成時,先在離屏
TBitmap 合成完成,再一次 BitBlt 到螢幕 (雙緩衝)。
完整動畫範例 (飛機飛過藍天)
// FormCreate
ImageBg->Picture->LoadFromFile("BlueSky.bmp");
ImageBg->Transparent = false;
ImagePlane->Picture->LoadFromFile("Plane.bmp");
ImagePlane->Transparent = true;
ImagePlane->AutoSize = true;
ImagePlane->Left = 0; ImagePlane->Top = 50;
Timer1->Interval = 50; Timer1->Enabled = true;
// Timer1Timer
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
ImagePlane->Left += 5;
if (ImagePlane->Left > ClientWidth) ImagePlane->Left = -ImagePlane->Width;
}