GDI+ 引入 Image 與 Bitmap 兩大核心類別,統一封裝 BMP/GIF/JPEG/TIFF/PNG/WMF/EMF 等主流格式,讓圖像載入、顯示、轉換、縮放、旋轉、插值品質控制變得極其簡單,徹底擺脫手動解析檔案結構的痛苦。
| 格式 | 特點 | 適用場景 |
|---|---|---|
| BMP | Windows 原生,無壓縮,體積大 | 桌面壁紙、簡單圖像 |
| GIF | LZW 壓縮、256 色、支援動畫/透明 | 網頁圖示、簡單動畫 |
| JPEG | 有損壓縮(DCT+Huffman),壓縮比高,不支援透明 | 照片、真彩圖像 |
| TIFF | 標籤式結構,支援多種壓縮、色彩空間,跨平台佳 | 印刷、專業影像存檔 |
| PNG | 無損壓縮、Alpha 通道、Gamma 校正、支援真彩/灰度/索引 | 網頁透明圖像、截圖存檔 |
GetWidth/Height)、縮略圖生成(GetThumbnailImage)。GetPixel/SetPixel)、直接建構位圖、GDI 互操作。// 基本繪製
graphics.DrawImage(&image, 10, 10); // 左上角 (10,10)
graphics.DrawImage(&image, Rect(130,10,w,h)); // 目標矩形,自動縮放填充
// 平行四邊形映射(旋轉/拉伸/透視基礎)
Point pts[] = { Point(0,0), Point(w,0), Point(0,h) }; // 對應源圖左上、右上、左下
graphics.DrawImage(&image, pts, 3);
三點定義平行四邊形,第四點由系統自動推導;若兩軸不垂直即產生剪切/透視效果。
Image img(L"sunflower.jpg");
Point pts[] = { Point(0,0), Point(img.GetWidth(),0), Point(0,img.GetHeight()) };
Matrix m(1,0,0,1,230,10); // 平移至 (230,10)
m.Rotate(30); // 順時針 30°
m.Scale(0.63f, 0.6f); // 縮放
m.TransformPoints(pts, 3); // 套用變換
graphics.DrawImage(&img, pts, 3);
或直接使用 graphics.RotateTransform(30),但會影響後續所有繪圖操作。
graphics.SetInterpolationMode(InterpolationModeNearestNeighbor); // 低質量、最快
graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear); // 中等
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); // 高質量、最慢
縮放時自動插值,品質越高渲染越慢,按場景選擇。
Image* thumb = img.GetThumbnailImage(50, 50, NULL, NULL);
graphics.DrawImage(thumb, 20, 20);
delete thumb; // 必須手動釋放
Image::Save(L"out.png", &encoderClsid, ¶ms) 可輸出任意支援格式,配合 EncoderParameters 控制 JPEG 品質、PNG 壓縮等級。
GDI+ 以托管風格 API 包裝底層複雜性,配合 CImage(MFC 封裝)更貼合 VC 開發習慣,是 Windows 平台圖像處理的首選方案。