1. 程式人生 > >使用CxImage進行圖形和格式轉換(CBitmap to jpg or png or gif or bmp)

使用CxImage進行圖形和格式轉換(CBitmap to jpg or png or gif or bmp)

CxImage類庫介紹
CxImage類庫是一個幾乎可以管理所有的圖象檔案的C++類庫。它可以快捷地存取、顯示、轉換各種影象。
其他的圖形庫?有那麼多優秀的圖形庫,如OpenIL,FreeImage,PaintLib等等,它們是功能強大,齊全,而且是經常更新的。然而,如果你要使用他們,你可能會遇到一些麻煩,,因為它們大部分是平臺無關的,用C語言寫成,有的還夾雜著基本的C++ wrapper和大量的編譯選項的宣告需要你去處理。現在,一個新的GDI+類庫來了,或許CxImage不是最有用的,但是至少你是有原始碼的。這個類庫不是MFC類庫,完全是一個windows類庫,因為一些特殊的構造和繪圖函式,但是基礎是平臺無關的。

一.在你的程式中使用CxImage(Using MFC in Shared DLL + Debug 模式)



1.下載CxImage類庫
地址:http://www.xdp.it/download.htm

下載Download full source files (full) - 2.10 Mb 

2.解壓壓縮包,並編譯Demo2/Console.dsw,這個過程可能比較慢,中間檔案為60M 

3.編譯完成後搜尋*.lib檔案,一共搜尋出10個檔案,把它們複製到你的工程目錄中(任意)
它們分別為:CxImage.lib Jpeg.lib png.lib Tiff.lib jbig.lib zlib.lib j2k.lib cximagecrtd.lib(最後一個為靜態MFC庫時使用)

4.找到壓縮包中的CxImage資料夾,把它裡面的所有.h標頭檔案,複製到你的工程目錄中(任意)

5.在StdAfx.h檔案中,新增這些檔案

  1. // stdafx.h : include file for standard system include files,
  2. // or project specific include files that are used frequently, but
  3. // are changed infrequently
  4. //
  5. #if !defined(AFX_STDAFX_H__84F27293_E63B_443C_BA35_5322307D48DA__INCLUDED_)
  6. #define AFX_STDAFX_H__84F27293_E63B_443C_BA35_5322307D48DA__INCLUDED_
  7. #if _MSC_VER > 1000
  8. #pragma once
  9. #endif // _MSC_VER > 1000
  10. #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
  11. #include <afxwin> // MFC core and standard components
  12. #include <afxext> // MFC extensions
  13. #include <afxdisp> // MFC Automation classes
  14. #include <afxdtctl>    // MFC support for Internet Explorer 4 Common Controls
  15. #ifndef _AFX_NO_AFXCMN_SUPPORT
  16. #include <afxcmn>    // MFC support for Windows Common Controls
  17. #endif // _AFX_NO_AFXCMN_SUPPORT
  18. //新增CxImage到你的程式中(目錄為你上面新增位置,我把它們放在了lib資料夾中了)
  19. #include "lib/ximage.h"
  20. //#pragma comment(lib,"lib/cximagecrtd.lib") //靜態連結庫時使用
  21. #pragma comment(lib,"lib/cximage.lib")
  22. #pragma comment(lib,"lib/Jpeg.lib")
  23. #pragma comment(lib,"lib/consoled.lib")
  24. #pragma comment(lib,"lib/png.lib")
  25. #pragma comment(lib,"lib/zlib.lib")
  26. #pragma comment(lib,"lib/tiff.lib")
  27. #pragma comment(lib,"lib/jasper.lib")
  28. #pragma comment(lib,"lib/j2k.lib")
  29. #pragma comment(lib,"lib/jbig.lib")
  30. //{{AFX_INSERT_LOCATION}}
  31. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  32. #endif // !defined(AFX_STDAFX_H__84F27293_E63B_443C_BA35_5322307D48DA__INCLUDED_)

6.這樣就可以在你的程式中使用CxImage類了

7.演示程式

  1. void CTestDlg::OnButton1()
  2. {
  3. // TODO: Add your control notification handler code here
  4. //取得你的圖片資原始檔IDB_BITMAP1
  5. HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
  6. MAKEINTRESOURCE(IDB_BITMAP1));
  7. //建立物件
  8. CxImage *newImage = new CxImage();
  9. newImage->CreateFromHBITMAP(bitmap);
  10. //儲存為檔案,我發現的可以使用的有6個格式有三個格式未使用成功(gif,wbmg,wmf)....夠用了吧?
  11. newImage->Save("image.bmp",CXIMAGE_FORMAT_BMP); //注意不是CXIMAGE_SUPPORT_BMP
  12. newImage->Save("image.tga",CXIMAGE_FORMAT_TGA);
  13. newImage->Save("image.pcx",CXIMAGE_FORMAT_PCX);
  14. newImage->Save("image.jpg",CXIMAGE_FORMAT_JPG);
  15. newImage->Save("image.png",CXIMAGE_FORMAT_PNG);
  16. newImage->Save("image.tiff",CXIMAGE_FORMAT_TIF);
  17. newImage->Save("image.gif",CXIMAGE_FORMAT_GIF); //不成功,只能讀取第一貞圖片?
  18. newImage->Save("image.wbmp",CXIMAGE_FORMAT_WBMP); //不成功
  19. newImage->Save("image.wmf",CXIMAGE_FORMAT_WMF); //不成功
  20. newImage->Save("image.mng",CXIMAGE_FORMAT_MNG); //預設-未開啟此項功能
  21. newImage->Save("image.jbig",CXIMAGE_FORMAT_JBG); //預設-未開啟此項功能
  22. /*
  23. * CxImage配置檔案ximacfg.h
  24. * #define CXIMAGE_SUPPORT_BMP 1 //可用狀態(即不可取得和轉換成這種格式)
  25. * #define CXIMAGE_SUPPORT_MNG 0 //不可用狀態
  26. */
  27. }

其他說明
1.所支援的格式(in Doc)
formats #define required libraries size [Kbyte] BMP 
GIF 
ICO 
TGA 
PCX 
WBMP 
WMF CXIMAGE_SUPPORT_BMP 
CXIMAGE_SUPPORT_GIF 
CXIMAGE_SUPPORT_ICO 
CXIMAGE_SUPPORT_TGA 
CXIMAGE_SUPPORT_PCX 
CXIMAGE_SUPPORT_WBMP 
CXIMAGE_SUPPORT_WMF 
built in 
24 JPEG CXIMAGE_SUPPORT_JPG 
jpeg 
88 PNG CXIMAGE_SUPPORT_PNG 
png, zlib 
104 MNG CXIMAGE_SUPPORT_MNG 
mng, zlib, jpeg 
148 TIFF CXIMAGE_SUPPORT_TIF 
tiff, zlib, jpeg 
124 JBIG CXIMAGE_SUPPORT_JBG 
jbig 
28 PNM,PPM,PGM 
RAS CXIMAGE_SUPPORT_PNM 
CXIMAGE_SUPPORT_RAS 
jasper 
176 JPEG-2000 CXIMAGE_SUPPORT_JP2 
CXIMAGE_SUPPORT_JPC 
CXIMAGE_SUPPORT_PGX 
jasper 
176 
2.格式轉換示例

  1. CxImage image;
  2. // bmp -> jpg
  3. image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
  4. if (image.IsValid()){
  5. if(!image.IsGrayScale()) image.IncreaseBpp(24);
  6. image.SetJpegQuality(99);
  7. image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
  8. }
  9. // png -> tif
  10. image.Load("image.png", CXIMAGE_FORMAT_PNG);
  11. if (image.IsValid()){
  12. image.Save("image.tif",CXIMAGE_FORMAT_TIF);
  13. }

3.使用CxImage(In Doc),至今未弄懂....也沒按這個弄好過...不知道為什麼

  1. Project Settings
  2. |- C/C++
  3. | |- Code Generation
  4. | | |- Use run-time library : Multithreaded DLL (must be the same for
  5. | | | all the linked libraries)
  6. | | |- Struct member alignment : must be the same for all the linked
  7. | | | libraries
  8. | |- Precompiled headers : not using precompiled headers
  9. | |- Preprocessor
  10. | |- Additional Include Directories: ..cximage
  11. |- Link
  12. |- General
  13. |- Object/library modules: ../png/Debug/png.lib
  14. ../jpeg/Debug/jpeg.lib
  15. ../zlib/Debug/zlib.lib
  16. ../tiff/Debug/tiff.lib
  17. ../jasper/Debug/jasper.lib
  18. ../cximage/Debug/cximage.lib ...



二.使用CxImage(Using MFC in a Static Library + Debug 模式)
1.解壓壓縮包,開啟Demo2/Console.dsw,設定如下:
Project -> Setting -> Using MFC in a Static Library(注意是所有的專案都設定成這個)
2.確保c/c++ -> Code Generation -> Using run-time library 為 Mutithreaded
3.Debug模式下編譯,搜尋*.lib檔案,複製到工程目錄,包含進工程(當前工程也必須是Using MFC in a Static Library + Debug 模式),即可,包含方法同上
注意:生成的LIB檔案,比上面要少一個....不知道為什麼...少了consoled.lib,但並無大礙,不包含它即可

三.使用CxImage(Using MFC in a Static Library + Realese 模式)
1.解壓壓縮包,開啟Demo2/Console.dsw,設定如下:
Project -> Setting -> Using MFC in a Static Library(注意是所有的專案都設定成這個)
2.確保c/c++ -> Code Generation -> Using run-time library 為 Mutithreaded
3.Realese模式下編譯,搜尋*.lib檔案,複製到工程目錄,包含進工程(當前工程也必須是Using MFC in a Static Library + Realese模式),即可,包含方法同上
注意:生成的LIB檔案,同樣是少一個,不包含它即可

參考:
Open the CxImage workspace with all the libraries. Select Project->Properties. Select each project in the list and make sure they all have the same settings for the MFC library (Not Using MFC for a static library). Then select the C/C++ tab and select Code Generation in the combo box. In the Use Run-time Library combo box, make sure all of them are set to Single-Threaded (or multi threaded depending on your settings). Then remake all the libraries and try to recompile your project
Thanks Kelly. It works! Thanks again!:) It turns out that CxImage static lib projects, in my case, are not set uniformly the same; some uses MFC shared library while some uses MFC static library