在向大家介绍CxImage类库之前,先向大家推荐一个优秀的站点: http://www.codeproject.com。这个站点有很多值得收藏的文章和源码。本文就是根据此站点相关信息写成。
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如 OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这 些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台 无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。 CxImage类库的结构:一个CxImage对象是一个扩展了的位图。作者只是在位图结构上添加了一些起存储信息作用的成员变量。一个CxImage对象(同时)也是一组层。每个 层只有在需要时才会分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明 层,CxImage::pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。在这三个特殊层面的基础上,你可以增加一些额外 的层,这些层可以存储在CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。因此,你可以构造很复杂的嵌套层。下面是 CxImage的一些成员变量:
class CxImage
typedef struct tagCxImageInfo {
DWORD
RGBQUAD last_c;
} CXIMAGEINFO;
要在picture box中显示一个png格式的文件,只需:
CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
HBITMAP m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
m_picture.SetBitmap(m_bitmap);
其它格式则类推。
Examples: how to ...
... convert from a format to another
CxImage
// bmp -> jpg
image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
}
// png -> tif
image.Load("image.png", CXIMAGE_FORMAT_PNG);
if (image.IsValid()){
}
... load an image resource
//Load the resource IDR_PNG1 from the PNG resource type
CxImage* newImage = new CxImage();
newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
or//Load the resource IDR_JPG1 from DLL
CxImage* newImage = new CxImage();
HINSTANCE hdll=LoadLibrary("imagelib.dll");
if (hdll){
}
or//Load a bitmap resource;
HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
CxImage *newImage = new CxImage();
newImage->CreateFromHBITMAP(bitmap);
... decode an image from memory
CxImage image((BYTE*)buffer,size,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage image(&memfile,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage* image = new CxImage();
image->Decode(&memfile,type);
... encode an image in memory
long size=0;
BYTE* buffer=0;
image.Encode(buffer,size,image_type);
...
free(buffer);
orCxMemFile memfile;
memfile.Open();
image.Encode(&memfile,image_type);
BYTE* buffer = memfile.GetBuffer();
long size = memfile.Size();
...
free(buffer);
... create a multipage TIFF
CxImage *pimage[3];
pimage[0]=&image1;
pimage[1]=&image2;
pimage[2]=&image3;
FILE* hFile;
hFile = fopen("multipage.tif","w+b");
CxImageTIF multiimage;
multiimage.Encode(hFile,pimage,3);
fclose(hFile);
orFILE* hFile;
hFile = fopen("c:\\multi.tif","w+b");
CxImageTIF image;
image.Load("c:\\1.tif",CXIMAGE_FORMAT_TIF);
image.Encode(hFile,true);
image.Load("c:\\2.bmp",CXIMAGE_FORMAT_BMP);
image.Encode(hFile,true);
image.Load("c:\\3.png",CXIMAGE_FORMAT_PNG);
image.Encode(hFile);
fclose(hFile);
... copy/paste an image
//copy
HANDLE hDIB = image->CopyToHandle();
if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {
}
CloseClipboard();
//paste
HANDLE hBitmap=NULL;
CxImage *newima = new CxImage();
if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
if (hBitmap) newima->CreateFromHANDLE(hBitmap);
CloseClipboard();
需要大家注意的是:整个CxImage类库非常大。如果你只需要能处理其中的几种格式,你可以在主要的头文件ximage.h中找到一些开关选项来关闭一 些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎 挑选一些你真正需要的类库。作者提供的示例工程在编译后,你会发现如下一些文件: ·CxImage : cximage.lib - static library ·CxImageCrtDll : cximagecrt.dll - DLL not using mfc ·CxImageMfcDll : cximage.dll - DLL using mfc ·Demo : demo.exe - program linked with cximage.lib and the C libraries ·DemoDll : demodll.exe - program linked with cximagecrt.dll ·j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries 构建这些工程需要耗费几分钟的时间(中间文件可达60MB)。下面则是使用CxImage类库前必须设置的一些参数:
Project Settings
兼容性: - Microsoft Visual C++ 6.0 (static library, DLL and OCX builds) - Microsoft Visual C++ .NET 2003 - Borland C++ Builder version 3 and version 6 - Kdevelop 2.1 with gcc 2.96 (Linux) 关于CxImage类库作者: Davide Pizzolato,一位电子工程师。1984年开始编程,已不在乎使用何种编程语言来开发软件。现就职于Askoll的电子研发部。
有很多关于CxImage的使用方法,其中也给出了下载连链接。但考试大提示在参照他们的方法一步一步进行,最后总是失败,要么是版本的问题,要么是讲解 的太晦涩不清。唉,有的甚至写一句话不知道要表达什么意思。比如说,考试大在某个blog上看到的一句:“//添加CxImage到你的程序中(目录为你 上面添加位置,我把它们放在了lib文件夹中了)”
说的是啥呀?这里的CxImage是什么?类?文件夹?文件?
目录为你上面添加位置?这句话想表达个啥意思啊?目录为位置?
这些blog实在是误导初学者。 下面考试大把使用的方法用简短扼要的文字讲解一下。
1. 下载CxImage包
http://code.knowsky.com/down/5626.html#1
2. 解压,编译文件夹下的所有dsw文件。
3. 搜索到所有的lib文件,在你的过程目录下新建个文件夹就叫做CxImageLib吧,
把搜索到的lib文件copy到CxImageLib文件夹下。
4. 在你的工程文件夹下新建一个文件夹,就叫做CxImageHeadFile吧,
把CxImage文件夹下的xfile.h ximadefs.h xiofile.h xmenfile.h 四个文件
copy到CxImagefile文件夹里面。
5. 在你的工程的stdafx.h 文件里面添加以下几行:
#include "ximage.h"
//#pragma comment(lib,"lib/cximagecrtd.lib") //静态链接库时使用
#pragma comment(lib,"cximage.lib")
#pragma comment(lib,"Jpeg.lib")
#pragma comment(lib,"png.lib ")
#pragma comment(lib,"zlib.lib ")
#pragma comment(lib,"tiff.lib ")
#pragma comment(lib,"jasper.lib ")
#pragma comment(lib,"j2k.lib ")
#pragma comment(lib,"jbig.lib ")
6. ok,编译就可用通过了。试试看行不行:先添加一个消息响应函数。
在里面写上几句:
CxImage image;
if( !image.Load("image.bmp", CXIMAGE_FORMAT_BMP))
{ return };
if (image.IsValid())
{
image.Save("image.tif",CXIMAGE_FORMAT_TIF);
}
编译CxImage类库
作者已经提供了整个类库配置的工程文件CxImgLib.dsw (VC++6.0),只要打开它进行编译即可。需要大家注意的是:整个CxImage类库非常大。如果你只需要能处理其中的几种格式,编译该类库时,你可以在配置的头文件ximcfg.h 中找到一些编译开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。
//类库配置文件:ximacfg.h
#define
CXIMAGE_SUPPORT_JPG
1
//如果要实现bmp->jpg
则必须打开
#define
CXIMAGE_SUPPORT_BMP
1
#define
CXIMAGE_SUPPORT_GIF
1
#define
CXIMAGE_SUPPORT_JPG
1
//以上为必须打开,下面的随便............
#define
CXIMAGE_SUPPORT_PNG
0//不使用它
#define
CXIMAGE_SUPPORT_MNG
0
#define
CXIMAGE_SUPPORT_ICO
1
#define
CXIMAGE_SUPPORT_TIF
0//
#define
CXIMAGE_SUPPORT_TGA
0//
#define
CXIMAGE_SUPPORT_PCX
0//
#define
CXIMAGE_SUPPORT_WBMP
0//
#define
CXIMAGE_SUPPORT_WMF
0//
#define
CXIMAGE_SUPPORT_J2K
0 // Beta, use
JP2
#define
CXIMAGE_SUPPORT_JBG 0
其他的可以不打开
编译该类库有好几个选择的工程,如下图所示:
各工程的作用对应如下:
在程序中应用CxImage类库进行图像类型转换
在你的VC工程中使用这个类库,要对工程进行如下设置(Project Settings):
|- C/C++
| |- Code Generation
|
| |- Use run-time library :
Multithreaded DLL (must be the same for
|
| | all the linked libraries)
//应该只要是多线程DLL即可,DEBUG的也行
|
| |- Struct member alignment :
must be the same for all the linked libraries
| |- Precompiled headers : not
using precompiled headers
| |- Preprocessor
|
|- Additional Include Directories:
..\cximage(该处填CxImage里的.h和.cpp文件拷贝并导入工程后所在的文件夹,填写后在工程中include时编译器会查找该文件夹,故include的文件无需路径)
|- Link
|-
General
|- Object/library modules: png.lib
jpeg.lib
zlib.lib
tiff.lib
jasper.lib
cximage.lib (把需要的lib文件从CxImage中拷贝到工程中的lib文件所在的目录)
并且从CxImage中将xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、 xmemfile.cpp、xmemfile.h拷贝到工程文件夹下并将CxImage.h文件加入工程中即可。也可以设置vc6的"tools"中 的"include"路径.
下面介绍应用它进行图像类型转换的方式:
1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)
CxImage
image; //
定义一个CxImage对象

//
从bmp文件转换为jpg文件(bmp ->
jpg)
image.Load("image.bmp",
CXIMAGE_FORMAT_BMP); //先装载bmp文件,需要指定文件类型
//
判断加载的bmp文件是否存在。
if
(image.IsValid())...{
//
Returns true if the image has 256
colors and a linear grey scale
palette.
if(!image.IsGrayScale())
image.IncreaseBpp(24); //
param nbit: 4, 8,
24
image.SetJpegQuality(99); //
设置图像的压缩质量参数(从0到100,数值越大,质量越高)
image.Save("image.jpg",CXIMAGE_FORMAT_JPG); //
把压缩后的图像以jpg文件类型保存起来。
}

// 从png文件转换为tif文件(png ->
tif)
image.Load("image.png",
CXIMAGE_FORMAT_PNG);
if
(image.IsValid()){
image.Save("image.tif",CXIMAGE_FORMAT_TIF);
}
官网:http://www.codeproject.com/bitmap/cximage.asp
作者:http://www.xdp.it/
作者已经提供了整个类库配置的工程文件CxImgLib.dsw (VC++6.0),只要打开它进行编译即可。需要大家注意的是:整个CxImage类库非常大。如果你只需要能处理其中的几种格式,编译该类库时,你可以在配置的头文件ximcfg.h 中找到一些编译开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。
//.............
其他的可以不打开
编译该类库有好几个选择的工程,如下图所示:
各工程的作用对应如下:
- CxImage : cximage.lib - static library
- CxImageCrtDll : cximagecrt.dll - DLL not using mfc
- CxImageMfcDll : cximage.dll - DLL using mfc
- Demo : demo.exe - program linked with cximage.lib and the C libraries
- DemoDll : demodll.exe - program linked with cximagecrt.dll
- j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries
在程序中应用CxImage类库进行图像类型转换
在你的VC工程中使用这个类库,要对工程进行如下设置(Project Settings):
|- C/C++
|
|
|
|
|
|
|
|- Link
并且从CxImage中将xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、 xmemfile.cpp、xmemfile.h拷贝到工程文件夹下并将CxImage.h文件加入工程中即可。也可以设置vc6的"tools"中 的"include"路径.
下面介绍应用它进行图像类型转换的方式:
1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)
官网:http://www.codeproject.com/bitmap/cximage.asp
作者:http://www.xdp.it/
没有评论:
发表评论