在開發過程中需要處理圖片時,尋找合適的開源庫往往令人頭疼。後來發現 CxImage 這個開源專案相當好用,支援 BMP、GIF、ICO、JPG、PNG、TIFF 等多種主流格式,對於一般應用程式開發者而言,無需深入研究圖像編解碼細節,且能有效解決圖片格式版本繁雜、相容性難題的困擾。雖然 CxImage 專案初看龐大複雜,但實際使用起來比開源視訊解碼庫簡單許多,極具實用價值。
CxImage 是一個 C++ 圖像處理庫,具備載入、儲存、顯示與轉換圖像的功能,支援透明圖層與多圖層操作。相容格式涵蓋 BMP、GIF、JPG、PNG、MNG、TIF、ICO、TGA、PCX、J2K、JBG、RAS、PNM、RAW 及 PSD 等。其 Demo 專案支援 VC++ 及 Visual Studio 編譯環境。官方下載位址:SourceForge CxImage 專案頁。
從官網下載 CxImage 壓縮包,解壓至當前專案(例如 MyTest)的 CxImage 目錄下。CxImage 支援靜態與動態連結,本文以靜態連結為例。若需測試官方 Demo,直接編譯其目錄下的 demo 專案即可。
在 VC++ 6.0 中,將以下 .dsp 專案檔加入 MyTest 方案:
cximage.dsp —— 產生 cximage.libjasper.dsp、Jpeg.dsp、mng.dsp、png.dsp、tiff.dsp —— 各圖像格式庫zlib.dsp —— 核心相依庫demo.dsp —— 官方示範專案(可選)其他格式庫視需求自行加入。
在專案 Settings → Link 中加入對應 .lib 路徑,注意 Debug/Release 版本必須分別設定:
cximage/Cximage/Debug/cximage.libcximage/jasper/Debug/jasper.libcximage/jpeg/Debug/jpeg.libcximage/png/Debug/png.libcximage/zlib/Debug/zlib.lib格式支援由 cximage/Cximage/ximacfg.h 控制,將需啟用的格式宏定義為 1,其餘設為 0。例如:
#define CXIMAGE_SUPPORT_BMP 1 #define CXIMAGE_SUPPORT_JPG 1 #define CXIMAGE_SUPPORT_PNG 1 #define CXIMAGE_SUPPORT_TIF 0 #define CXIMAGE_SUPPORT_JP2 1 // ... 其他格式依需求設定

關鍵原則: ximacfg.h 設定、專案連結庫、子專案三者必須完全對應,否則會出現連結錯誤或執行時崩潰。
CxImage 支援 Debug、Release、Unicode Debug、Unicode Release 四種建置模式,務必與主專案一致。先建置所有 CxImage 子專案產生 .lib,再建置主專案。
以下程式碼示範載入 JPG 並繪製至靜態圖片控制項(CStatic):
#include "cximage\CxImage\ximage.h"
CxImage *m_pCSample = nullptr;
HBITMAP m_SampleBitMap = nullptr;
// 初始化靜態控制項樣式
m_SamplePic.ModifyStyle(SS_BLACKFRAME, SS_BITMAP | SS_CENTERIMAGE);
// 釋放舊物件
if (m_pCSample != nullptr) {
delete m_pCSample;
m_pCSample = nullptr;
}
// 載入圖片
m_pCSample = new CxImage();
m_pCSample->Load("sample.jpg", CXIMAGE_FORMAT_JPG);
// 處理 Alpha 通道
if (m_pCSample->AlphaIsValid())
m_pCSample->AlphaCreate();
int m_iImageHeight = m_pCSample->GetHeight();
int m_iImageWidth = m_pCSample->GetWidth();
// 取得裝置內容
HDC hDC = m_SamplePic.GetDC()->m_hDC;
// 重採樣至控制項大小
CRect lRect;
m_SamplePic.GetClientRect(&lRect);
m_pCSample->Resample(lRect.right, lRect.bottom);
// 建立並設定位圖
if (m_SampleBitMap) {
DeleteObject(m_SampleBitMap);
m_SampleBitMap = nullptr;
}
m_SampleBitMap = m_pCSample->MakeBitmap(hDC);
m_SamplePic.SetBitmap(m_SampleBitMap);
註:m_SamplePic 為對話方塊上 CStatic 控制項的控制變數,屬性需設為 Bitmap 與 Center Image。
ximage.h:所有公開方法皆在該標頭檔宣告,是最權威的 API 參考。demo 專案涵蓋幾乎所有功能,遇到不會用的功能,直接在 Demo 中搜尋關鍵字即可追蹤用法。