首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

善用 GDI+ 實現圖像旋轉與進階繪圖

     編輯:關於VC++

為什麼選擇 GDI+?

傳統 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved