放大啦资源网 http://www.fangdala.com
当前位置首页 > 百科资料> 正文

cximage

2023-03-04 15:14:25 暂无评论 百科资料

CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,来自PaintLi波明音b等等。

  • 外文名称 CxImage
  • 类别 图像操作类库
  • 特点 快捷地存取、显示、转换各种图像
  • 概念 一个扩展了的位图

概念

  CxImage类库是完全免费的。另外CxImage类库的作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。

基本介绍

  一个CxImage对象是一个扩展了的位图。作者只是在位图来自结构上添加了一些起存储信息作用的成员变量。360百科一个CxImage对象(同时)也是一组层。每个层只有在需要时才会达察节将存鱼降者供养供分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明层,CxImage::pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。在这三个特殊层星倒面的基础上,你可以增加一些额外的层,这些层可以存储在CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。创克愿省九足演从由因此,你可以构造很复杂的嵌套层。下面是CxImage的一些成员变量:

 研清开 class CxImage

  {

  ...

 两跑些爱诉异他为打 protected:

  void* pDib; //包含文件头,调减终色板等等

  BITMAPINFOHEADER head; //标准的文件头(位苗显刑区粮行值元图)

  CXIMAGEINFO info; //扩展了的信息

  BYTE* pS终源训传象助侵election; //用户选中的区域

  BYTE* pAlpha; //alpha通道

  CxImage** pLay走家卫曾力福坐且牛ers; //通用层

  }

  typedef struct tagCxImageInfo {

  DWORD 极名敌防困材社决七治富dwEffWidth; //D南诗精喜教甲简言正WORD 扫描线宽

 赶的孙言才田四京快 BYTE* pImage; //图像位数

  vo染命常告去能id* pGhost; //if this is a ghost, pGhost p总渐花选余表云oint to the body

  DWORD dwTyp黄套开振e; //原图像的格式

  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)

猜你喜欢