转自:http://www.sudu.cn/info/html/edu/20080403/259688.html
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
{
...
protected:
void* pDib; //包含文件头,调色板等等
BITMAPINFOHEADER head; //标准的文件头(位图)
CXIMAGEINFO info; //扩展了的信息
BYTE* pSelection; //用户选中的区域
BYTE* pAlpha; //alpha通道
CxImage** pLayers; //通用层
}
typedef struct tagCxImageInfo {
DWORD dwEffWidth; //DWORD 扫描线宽
BYTE* pImage; //图像位数
void* pGhost; //if this is a ghost, pGhost point to the body
DWORD dwType; //原图像的格式
char szLastError[256]; //出错信息
long nProgress; //监视循环的次数
long nEscape; //跳出标志
long nBkgndIndex; //GIF, PNG, MNG格式使用
RGBQUAD nBkgndColor; //RGB三原色透明度
BYTE nQuality; //JPEG格式使用
long nFrame; //TIF, GIF, MNG使用 :实际的帧数
long nNumFrames; //TIF, GIF, MNG使用 :帧总数
DWORD dwFrameDelay; //GIF, MNG使用
long xDPI; //水平分辨率
long yDPI; //垂直分辨率
RECT rSelectionBox; //选中的矩形区
BYTE nAlphaMax; //阴影的最大不透明度
bool bAlphaPaletteEnabled; //如果调色板中有Alpha通道则为真
bool bEnabled; //打开绘图函数
long xOffset;
long yOffset;
DWORD dwEncodeOption; //一些编码选项
RGBQUAD last_c; //一些优化选项
BYTE last_c_index;
bool last_c_isvalid;
long nNumLayers;
DWORD dwFlags;
} 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 image;
// bmp -> jpg
image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
if(!image.IsGrayScale()) image.IncreaseBpp(24);
image.SetJpegQuality(99);
image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
}
// png -> tif
image.Load("image.png", CXIMAGE_FORMAT_PNG);
if (image.IsValid()){
image.Save("image.tif",CXIMAGE_FORMAT_TIF);
}
... 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),
"PNG"),CXIMAGE_FORMAT_PNG);
or//Load the resource IDR_JPG1 from DLL
CxImage* newImage = new CxImage();
HINSTANCE hdll=LoadLibrary("imagelib.dll");
if (hdll){
HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");
newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
FreeLibrary(hdll);
}
or//Load a bitmap resource;
HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1)));
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())) {
if(::EmptyClipboard()) {
if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {
AfxMessageBox( "Unable to set Clipboard data" );
} } }
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
|- C/C++
| |- Code Generation
| | |- Use run-time library : Multithreaded DLL (must be the same for
| | | all the linked libraries)
| | |- Struct member alignment : must be the same for all the linked
| | | libraries
| |- Precompiled headers : not using precompiled headers
| |- Preprocessor
| |- Additional Include Directories: ..\cximage
|- Link
|- General
|- Object/library modules: ../png/Debug/png.lib
../jpeg/Debug/jpeg.lib
../zlib/Debug/zlib.lib
../tiff/Debug/tiff.lib
../cximage/Debug/cximage.lib ...
兼容性: - 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的电子研发部。
///////////////////////////////////////////////////////////////////////////////////
http://www.cppblog.com/acoder/archive/2009/10/27/99568.aspx
说明一下这个CxImage类的简单用法,希望给刚接触CxImage的朋友带来一些帮助,首先我要说明的是在这里我以CxImage 6.0.0.0版为例(各个版本可有能所不同)。官方下载地址是:http://www.xdp.it/cximage/
打开工程后可以看到下例这些工程:
- CxImage
- CxImageCrtDll
- CxImageMfcDll
- dome
- domeDll
- jasper
- jbig
- jpeg
- libdcr
- mng
- png
- tiff
- zlib
1。首先我们要确定在程序中是希望静态链接还是动态链接,在这里我建议大家使用动态链接,因为这个库有点大,如果使用静态链接的话你的应用程序体积会额外增加1MB多。
2。然后确定在MFC中使用还是在CRT环境中使用,这个库专门为你建了这两个工程来创建不同环境中使用的运行时库,跟据你的需求来选择编译CxImageCrtDll还是CxImageMfcDll工程,如果你希望使用静态库链接的话除了这两个工程不需要编译其它的工程都需要编译。并且在引用这个静态库的时候要把这些所有编译过的工程里的*.lib全部拷到你的程里去。还有要注意编译的选项要和自己的工程设置一样,比如,是release 方式还是debug,是Unicode还是非Unicode。
3。OK编译完工程后将以下文件拷到你建立的工程里去
先将头文件拷到你的工程里去:
xfile.h、ximacfg.h、ximadef.h、ximage.h、xiofile.h、xmemfile.h
使用静态链接需要拷以下文件:
cximage.lib、png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib
如用动态链接需要拷以下文件:
cximage.lib、cximage.dll
4。在你的工程里引用这个库#include "ximage.h"、#pragma comment(lib, "cximage.lib")如果是静态链接拷过来的那些*.lib文件全部要引用进去否则无法链接,在这里有人可能会问既然只包含了"ximage.h"这一个头文件为什么要拷那么多头文件过来呢?这是因为"ximage.h"这个头文件依赖那几个头文件所以必须拷过来。
5。现在你就可以使用这个CxImage库了,那我们来加载一幅图片然后将它显示出来吧:
CxImage image; // 定义一个CxImage对象
image.Load("Ooopsy.png", CXIMAGE_FORMAT_PNG); // 加载一幅png图片
// 在OnPaint消息里显示出来
image.Draw(dc.GetSafeHdc(), 0, 0);
以上只介绍最简单的用法,至于基它的功能你就自已尝试,我就不多说了,要是我一下子说完了CxImage开发者就不需要写文档说明了,在它的跟目录下有一个index.htm这就是它的文档起始页,如果你需要的话就自已去看吧!
具体应用技巧
1、打开一张图
可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图
CxImage::CxImage(const char * filename, DWORD imagetype)
其中filename是需要打开的文件路径,imagetype是文件类型,支持的类型有:
CXIMAGE_FORMAT_UNKNOWN,CXIMAGE_FORMAT_BMP,CXIMAGE_FORMAT_GIF,CXIMAGE_FORMAT_JPG,CXIMAGE_FORMAT_PNG,CXIMAGE_FORMAT_MNG,CXIMAGE_FORMAT_ICO,CXIMAGE_FORMAT_TIF,CXIMAGE_FORMAT_TGA,CXIMAGE_FORMAT_PCX,CXIMAGE_FORMAT_WBMP,CXIMAGE_FORMAT_WMF,CXIMAGE_FORMAT_J2K,CXIMAGE_FORMAT_JBG,CXIMAGE_FORMAT_JP2,CXIMAGE_FORMAT_JPC,CXIMAGE_FORMAT_PGX,CXIMAGE_FORMAT_PNM,CXIMAGE_FORMAT_RAS,
当然,这么多格式很难记住,我们可以通过如下函数来直接获得文件的格式。
int FindType(const CString& filename)
{
CString ext = filename.Right(filename.GetLength()-filename.ReverseFind('.')-1);
int type = 0;
if (ext == "bmp")type = CXIMAGE_FORMAT_BMP;
#if CXIMAGE_SUPPORT_JPG
else if (ext=="jpg"||ext=="jpeg")type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_GIF
else if (ext == "gif")type = CXIMAGE_FORMAT_GIF;
#endif
#if CXIMAGE_SUPPORT_PNG
else if (ext == "png")type = CXIMAGE_FORMAT_PNG;
#endif
#if CXIMAGE_SUPPORT_MNG
else if (ext=="mng"||ext=="jng")type = CXIMAGE_FORMAT_MNG;
#endif
#if CXIMAGE_SUPPORT_ICO
else if (ext == "ico")type = CXIMAGE_FORMAT_ICO;
#endif
#if CXIMAGE_SUPPORT_TIF
else if (ext=="tiff"||ext=="tif")type = CXIMAGE_FORMAT_TIF;
#endif
#if CXIMAGE_SUPPORT_TGA
else if (ext=="tga")type = CXIMAGE_FORMAT_TGA;
#endif
#if CXIMAGE_SUPPORT_PCX
else if (ext=="pcx")type = CXIMAGE_FORMAT_PCX;
#endif
#if CXIMAGE_SUPPORT_WBMP
else if (ext=="wbmp")type = CXIMAGE_FORMAT_WBMP;
#endif
#if CXIMAGE_SUPPORT_WMF
else if (ext=="wmf"||ext=="emf")type = CXIMAGE_FORMAT_WMF;
#endif
#if CXIMAGE_SUPPORT_J2K
else if (ext=="j2k"||ext=="jp2")type = CXIMAGE_FORMAT_J2K;
#endif
#if CXIMAGE_SUPPORT_JBG
else if (ext=="jbg")type = CXIMAGE_FORMAT_JBG;
#endif
#if CXIMAGE_SUPPORT_JP2
else if (ext=="jp2"||ext=="j2k")type = CXIMAGE_FORMAT_JP2;
#endif
#if CXIMAGE_SUPPORT_JPC
else if (ext=="jpc"||ext=="j2c")type = CXIMAGE_FORMAT_JPC;
#endif
#if CXIMAGE_SUPPORT_PGX
else if (ext=="pgx")type = CXIMAGE_FORMAT_PGX;
#endif
#if CXIMAGE_SUPPORT_RAS
else if (ext=="ras")type = CXIMAGE_FORMAT_RAS;
#endif
#if CXIMAGE_SUPPORT_PNM
else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;
#endif
else type = CXIMAGE_FORMAT_UNKNOWN;
return type;
}
2、保存一张图
bool CxImage::Save(LPCWSTR filename, DWORD imagetype=0)
参数和上面是一样的。
3、得到图形数据,以便在OpenGL中使用材质
BYTE*CxImage::GetBits(DWORD row = 0);
4、得到图形大小
longGetSize();
5、得到图形高度和宽度
DWORDCxImage::GetHeight();
DWORDCxImage::GetWidth();
6、得到文件类型
DWORDCxImage::GetType()const;
7、得到最后一个错误
char*CxImage::GetLastError();
8、在界面中绘制出来
longCxImage::Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL)
HDC 绘图设备,rect 绘图的区域,确定绘图的左上角和右下角坐标。pClipRect,裁剪区域,一般可以和绘图区域一样大小,除非特殊需要。
分享到:
相关推荐
【标题】:“CxImage类库源码” 【描述】:“CxImage类库源码,可以直接使用,有Demo” 【知识点详解】: CxImage是一个强大的C++图像处理类库,广泛应用于Windows平台上的图像处理和显示任务。这个类库提供了一...
CXimage类库 它是平台无关的 它是自由软件、免费的、开源的 支持多种平面格式:BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等,还有更多! 功能强大:几何变换、图像处理、图像格式转换等。 使用简单:下面...
**cximage类库详解** cximage是一个开源的C++类库,主要用于图像处理。它提供了丰富的功能,包括图像的读取、显示、格式转换等,是进行图像处理项目时的一个实用工具。由于其开源特性,开发者可以根据自己的需求对...
CXImage 类库是一款强大的图像处理库,主要用于在C++环境中进行图像操作。它提供了丰富的功能,包括但不限于图像的转换、旋转以及二值化处理。在本文中,我们将深入探讨这些核心知识点,帮助开发者更好地理解和应用...
这是以前下载下来学习的一个图片处理库。CxImage是一个C ++类,用于加载,保存,显示,转换BMP,JPEG,GIF,PNG,TIFF,MNG,ICO,PCX,TGA,WMF,WBMP,JBG,J2K图像
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说...
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说...
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说...
CxImage类库主要包含以下知识点: 1. 图像文件格式支持:CxImage支持包括但不限于BMP、JPEG、GIF、PNG、TIFF、MNG、ICO、PCX、TGA、WMF、WBMP、JBG、J2K等格式的图像文件。这意味着开发者可以使用CxImage来处理几乎...
CxImage是一个非常流行的C++类库,它允许开发者在Windows平台上处理图像,包括读取、写入、显示和编辑各种常见的图像格式,如BMP、JPEG、PNG、GIF等。这个库在开发图形用户界面或图像处理应用程序时非常有用。 该...
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说...
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说...
CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。虽然有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全。但我要说,这些类库基本上没有免费的,...
CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要...
《cxImage类库:强大的C++图像处理工具》 在计算机科学领域,图像处理是一项至关重要的技术,广泛应用于各种场景,如图形用户界面、图像分析、数字艺术等。在C++编程环境中,开发者通常会利用类库来实现这些功能,...
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。 里面包含了所有cximage702_full库的源码文档,以及自己编译好的库文件 动态库: cximaged.dll cximage.dll cximagecrtd.dll ...
标题中的"cximage--已编译.rar"表明这是一个包含预编译的CxImage类库的压缩文件,已经过Visual C++(vc)编译,可以直接在VC环境下使用,极大地简化了开发者的集成工作。 CxImage类库的核心是其强大的图像处理功能...
CxImage 6.0 VC 图形类库,包括了对jbig、png、mng、jpeg、tiff等多种图像格式文件的处理操作,CxImage是一个相当完美的VC图像处理类库,附带有一个DEMO示例,通过实例,你可了解CxImage控件的强大图片处理功能。
本文将深入探讨cximage类库的核心功能、设计理念以及如何在实际项目中应用。 cximage类库的核心是其对图像数据的高效管理与处理。通过封装底层的图像操作函数,cximage使得C++开发者可以方便地进行图像的读取、写入...
1. **CxImage类库介绍**: CxImage是一个开源的C++图像处理库,它支持多种图像格式,如BMP、JPEG、PNG、GIF、TIFF等。通过简单的API,开发者可以方便地在程序中进行图像的读取、显示、编辑和保存。 2. **基本使用*...