傳統 GDI 旋轉圖像需逐像素計算座標轉換(x' = x·cosθ - y·sinθ),效能極差。GDI+ 內建矩陣運算與硬體加速,單行程式碼即可完成旋轉、翻轉、縮放、裁剪等操作,且支援 JPEG、GIF、PNG 等多種格式。
在 CWinApp 衍生類別中加入啟動/關閉邏輯:
class CMyApp : public CWinApp {
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
public:
BOOL InitInstance() {
GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
// ... 原有初始化
return TRUE;
}
int ExitInstance() {
GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
};
以 Image 類別取代舊有 IPicture:
BOOL CPicture::Load(LPCTSTR pszPathName) {
Free();
USES_CONVERSION;
m_pImage = Image::FromFile(A2W(pszPathName), m_bUseEmbeddedColorManagement);
return m_pImage->GetLastStatus() == Ok;
}
BOOL CPicture::Render(CDC* pDC, CRect rc) const {
Graphics graphics(pDC->m_hDC);
graphics.DrawImage(m_pImage, rc.left, rc.top, rc.Width(), rc.Height());
return TRUE;
}
資源檔載入需建立全域記憶體流:
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pMem = (BYTE*)GlobalLock(hMem);
memcpy(pMem, lpRsrc, len);
IStream* pStm; CreateStreamOnHGlobal(hMem, FALSE, &pStm);
m_pImage = Image::FromStream(pStm);
Image::RotateFlip 接受 RotateFlipType 列舉,涵蓋 90°/180°/270° 旋轉搭配 X/Y 軸翻轉的所有組合:
void CPicture::Rotate(RotateFlipType rft) {
if (m_pImage) m_pImage->RotateFlip(rft);
}
範例:RotateFlipType::Rotate90FlipNone 即順時針旋轉 90°。
GetThumbnailImage:快速產生縮圖。CachedBitmap:以裝置最佳格式快取位圖,大幅提升重繪效能。GDI+ 雖非極致高效能(遊戲/影片建議用 DirectX),但對一般商務、文書、影像檢視應用,開發效率與功能豐富度遠勝 GDI。