使用CxImage进行图形和格式转换(CBitmap to jpg or png or gif or bmp)

Introduction

CxImage is a C++ class to manage almost any kind of images. It can load, save, display, transform images in a very simple and fast way. 
Why another image library? Around there are many good libraries (OpenIL, FreeImage, PaintLib ...), these are powerful, complete, and constantly updated. However if you ever try to use them, you may find some difficulties; because these libraries are mainly platform independent, written in C, sometimes with a basic C++ wrapper and with tons of compiler switch declarations. Now with the new GDI+ classes on the scene, maybe CxImage isn't so useful, but at least here you have the source code. It is not a MFC library, altogether it's a windows library, because of some particular constructors and the painting functions, but the backbone is platform independent.

CxImage类库介绍
CxImage类库是一个几乎可以管理所有的图象文件的C++类库。它可以快捷地存取、显示、转换各种图像。
其他的图形库?有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们是功能强大,齐全,而且是经常更新的。然而,如果你要使用他们,你可能会遇到一些麻烦,,因为它们大部分是平台无关的,用C语言写成,有的还夹杂着基本的C++ wrapper和大量的编译选项的声明需要你去处理。现在,一个新的GDI+类库来了,或许CxImage不是最有用的,但是至少你是有源代码的。这个类库不是MFC类库,完全是一个windows类库,因为一些特殊的构造和绘图函数,但是基础是平台无关的。

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

1.下载CxImage类库
地址:http://www.codeproject.com/bitmap/cximage.asp (需要注册) 
下载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.  
  6. #if !defined(AFX_STDAFX_H__84F27293_E63B_443C_BA35_5322307D48DA__INCLUDED_)
  7. #define AFX_STDAFX_H__84F27293_E63B_443C_BA35_5322307D48DA__INCLUDED_
  8.  
  9. #if _MSC_VER > 1000
  10. #pragma once
  11. #endif // _MSC_VER > 1000
  12.  
  13. #define VC_EXTRALEAN    // Exclude rarely-used stuff from Windows headers
  14.  
  15. #include <afxwin>         // MFC core and standard components
  16. #include <afxext>         // MFC extensions
  17. #include <afxdisp>        // MFC Automation classes
  18. #include <afxdtctl>             // MFC support for Internet Explorer 4 Common Controls
  19. #ifndef _AFX_NO_AFXCMN_SUPPORT
  20. #include <afxcmn>               // MFC support for Windows Common Controls
  21. #endif // _AFX_NO_AFXCMN_SUPPORT
  22.  
  23. //添加CxImage到你的程序中(目录为你上面添加位置,我把它们放在了lib文件夹中了)
  24. #include "lib/ximage.h"
  25. //#pragma comment(lib,"lib/cximagecrtd.lib") //静态链接库时使用
  26. #pragma comment(lib,"lib/cximage.lib")
  27. #pragma comment(lib,"lib/Jpeg.lib")
  28. #pragma comment(lib,"lib/consoled.lib")
  29. #pragma comment(lib,"lib/png.lib")
  30. #pragma comment(lib,"lib/zlib.lib")
  31. #pragma comment(lib,"lib/tiff.lib")
  32. #pragma comment(lib,"lib/jasper.lib")
  33. #pragma comment(lib,"lib/j2k.lib")
  34. #pragma comment(lib,"lib/jbig.lib")
  35.  
  36. //{{AFX_INSERT_LOCATION}}
  37. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  38.  
  39. #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.        
  5.          //取得你的图片资源文件IDB_BITMAP1     
  6.         HBITMAP bitmap = :: LoadBitmap (AfxGetInstanceHandle ( ),
  7.                 MAKEINTRESOURCE (IDB_BITMAP1 ) );
  8.        
  9.          //创建对象
  10.         CxImage *newImage =  new CxImage ( );
  11.         newImage->CreateFromHBITMAP (bitmap );
  12.  
  13.          //存储为文件,我发现的可以使用的有6个格式有三个格式未使用成功(gif,wbmg,wmf)....够用了吧?
  14.         newImage->Save ( "image.bmp",CXIMAGE_FORMAT_BMP )//注意不是CXIMAGE_SUPPORT_BMP
  15.         newImage->Save ( "image.tga",CXIMAGE_FORMAT_TGA );
  16.         newImage->Save ( "image.pcx",CXIMAGE_FORMAT_PCX );
  17.         newImage->Save ( "image.jpg",CXIMAGE_FORMAT_JPG );
  18.         newImage->Save ( "image.png",CXIMAGE_FORMAT_PNG );
  19.         newImage->Save ( "image.tiff",CXIMAGE_FORMAT_TIF );
  20.  
  21.         newImage->Save ( "image.gif",CXIMAGE_FORMAT_GIF )//不成功,只能读取第一贞图片?
  22.         newImage->Save ( "image.wbmp",CXIMAGE_FORMAT_WBMP )//不成功
  23.         newImage->Save ( "image.wmf",CXIMAGE_FORMAT_WMF )//不成功
  24.  
  25.         newImage->Save ( "image.mng",CXIMAGE_FORMAT_MNG )//默认-未打开此项功能
  26.         newImage->Save ( "image.jbig",CXIMAGE_FORMAT_JBG )//默认-未打开此项功能
  27.          /*
  28.          * CxImage配置文件ximacfg.h
  29.          * #define CXIMAGE_SUPPORT_BMP 1 //可用状态(即不可取得和转换成这种格式)
  30.          * #define CXIMAGE_SUPPORT_MNG 0 //不可用状态
  31.         */
  32. }

其他说明
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

原文地址:http://www.codeguru.com/forum/archive/index.php/t-261681.html

你可能感兴趣的:(mfc,include,library,图形,generation,preprocessor)