VC++中Jpeg與Bmp圖片格式互轉應該是會經常遇到,Jpeg相比Bmp在圖片大小上有很大優勢。
本文重點介紹使用現有的CImage類在內存中進行轉換,不需要保存為文件,也不需要引入第三方庫。
Libjpeg庫在8以后也支持了內存讀取和轉換,不過使用起來較為麻煩,還需要手動編譯,用CImage類完全可以實現,代碼更簡潔。
實現方法:
VC++對Jpeg、Png圖片的操作主要使用CImage,相信很多人用過CImage的Load和Save函數從文件讀取或保存Jpeg或Png格式的文件,這兩個重載了從流中讀取和寫入。
具體可參考MSDN:http://msdn.microsoft.com/zh-cn/library/tf4bytf8.aspx
使用CImage從內存中讀取Jpeg格式的圖片,只需要傳入一個IStream接口的流,IStream對象使用CreateStreamOnHGlobal進行創建。
下面貼出在內存中Jpeg轉換Bmp的函數代碼:
1 void JPEG2BMP(char* pUnZipData,unsigned long ulUnZipDataLen, CImage* pImage) 2 { 3 HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, ulUnZipDataLen); 4 void* pData = GlobalLock(hGlobal); 5 memcpy(pData, pUnZipData, ulUnZipDataLen); 6 GlobalUnlock(hGlobal); 7 8 IStream* pStream = NULL; 9 if(CreateStreamOnHGlobal(hGlobal, TRUE, & pStream) == S_OK) 10 { 11 CImage image; 12 if (SUCCEEDED(pImage->Load(pStream))) 13 { 14 15 } 16 pStream -> Release(); 17 } 18 GlobalFree(hGlobal); 19 }
pUnZipData為Jpeg圖片數據的指針,ulUnZipDataLen為圖片數據的長度。
記錄,為更好的自己!