Delphi Graphic 單元五大核心圖像類架構與用法
Graphics 單元定義了 Delphi 圖像處理的核心類層次結構。理解 TGraphic 為抽象基類,TBitmap/TMetafile/TIcon 為三大具體實現,TPicture 為容器封裝,TImage 為視覺控件,能讓你靈活選擇最適合的圖像處理方式。
類繼承體系
TGraphic (抽象基類)
├── TBitmap // 位圖 (DIB),像素級操作、雙緩衝繪圖核心
├── TMetafile // 圖元檔 (WMF/EMF),向量圖形、可縮放無失真
└── TIcon // 圖標 (ICO/CUR),多解析度、含透明遮罩
核心類功能對比
| 類別 | 檔案格式 | 特性 | 典型用途 | Canvas 輸出 |
| TBitmap | .bmp | 像素陣列、支援 ScanLine、透明色、Alpha 通道 | 離屏緩衝、圖像處理、截圖 | Canvas.Draw/StretchDraw |
| TMetafile | .wmf/.emf | GDI 記錄、向量、無限縮放不失真 | 報表輸出、剪貼簿向量圖、印刷 | Canvas.Draw/StretchDraw |
| TIcon | .ico/.cur | 多尺寸/色深、AND/XOR 遮罩透明 | 應用程式圖標、系統托盤、游標 | Canvas.Draw |
TPicture:統一容器
var
Pic: TPicture;
begin
Pic := TPicture.Create;
try
// 可載入任意支援格式
Pic.LoadFromFile('image.bmp'); // → Pic.Bitmap
Pic.LoadFromFile('drawing.wmf'); // → Pic.Metafile
Pic.LoadFromFile('app.ico'); // → Pic.Icon
// 統一訪問介面
Pic.Graphic // 返回當前具體 TGraphic 實例
// 顯示到 TImage
Image1.Picture.Assign(Pic);
finally
Pic.Free;
end;
end;
TImage 控件:視覺化展示
TImage
└── Picture: TPicture
├── Bitmap: TBitmap
├── Metafile: TMetafile
├── Icon: TIcon
└── Graphic: TGraphic (統一介面)
為何 TBitmap 是「內存畫板」之王
// 雙緩衝繪圖經典模式
var
BackBuffer: TBitmap;
begin
BackBuffer := TBitmap.Create;
try
BackBuffer.Width := ClientWidth;
BackBuffer.Height := ClientHeight;
BackBuffer.PixelFormat := pf32bit; // 高效像素格式
// 1. 所有繪圖操作在 BackBuffer 上
BackBuffer.Canvas.FillRect(ClientRect);
BackBuffer.Canvas.TextOut(10, 10, 'Hello');
// ... 複雜繪圖 ...
// 2. 一次性刷新到螢幕 (無閃爍)
Canvas.Draw(0, 0, BackBuffer);
finally
BackBuffer.Free;
end;
end;
格式轉換與互操作
| 來源 → 目標 | 方法 | 注意 |
| TBitmap → TMetafile | Metafile.Canvas.Draw(0,0,Bitmap) | 光柵化為向量記錄,非真正向量化 |
| TMetafile → TBitmap | Bitmap.Canvas.Draw(0,0,Metafile) | 光柵化渲染,指定 Bitmap 尺寸 |
| TIcon → TBitmap | Bitmap.Canvas.Draw(0,0,Icon) | 提取指定尺寸幀 |
| TBitmap → TIcon | Icon.Handle := Bitmap.ReleaseHandle | 需手動管理 Handle 生命週期 |
最佳實踐建議
- 高頻繪圖/動畫:
TBitmap 雙緩衝 (pf32bit + ScanLine)
- 報表/列印/向量輸出:
TMetafile 記錄 GDI 命令
- UI 圖標/游標:
TIcon 多解析度自動選擇
- 未知格式載入/顯示:
TPicture + TImage 自動識別
- 跨執行緒繪圖:每執行緒建立獨立
TBitmap,避免 Canvas 衝突
掌握這五大類的分工與協作,能讓 Delphi 圖像處理代碼既優雅又高效。
- 上一篇文章: Delphi 繪圖進階:Canvas.TextExtent 精確測量文字寬高實戰
- 下一篇文章: Delphi TBrush 畫刷完全指南:樣式、顏色、位圖填充與代碼範例
Copyright ©
程式碼之家 All Rights Reserved