当前位置: 首页 > 工具软件 > CxImage > 使用案例 >

cximage

鄢选
2023-12-01

原文转载于:http://blog.csdn.net/yacper/article/details/5299010

CxImage是一个可以用于MFC 的C++图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。可以实现BMP<->JPG,PNG <>TIFF格式等等的互相转换。

  CxImage不仅可以实现图像文件的类型转换,还可以实现在内存图像数据的类型转换,并且使用很方便。除了文件格式的相互转换,它还提供了很多很多图像后处理的功能,比如图像模糊,锐化等等,功能非常强大和实用。

 

示例: 如何转换一种格式到另外一种格式 

CxImage  image;
//  bmp -> jpg 
image.Load(  "  image.bmp  "  , CXIMAGE_FORMAT_BMP);
if  (image.IsValid()){
    
  if  (  !  image.IsGrayScale()) image.IncreaseBpp(  24  );
    image.SetJpegQuality(
  80  );
    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 the resource IDR_PNG1 from the PNG resource type 
CxImage  *  newImage  =  new  CxImage();
newImage
  ->  LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
                       
"  PNG  "  ),CXIMAGE_FORMAT_PNG);
或者
//  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);
}
或者
//  Load a bitmap resource; 
HBITMAP bitmap  =  ::LoadBitmap(AfxGetInstanceHandle(),
                           MAKEINTRESOURCE(IDB_BITMAP1)));
CxImage 
*  newImage  =  new  CxImage();
newImage
  ->  CreateFromHBITMAP(bitmap);

  如何解码内存 中的图像 

CxImage image((BYTE  *  )buffer,size,image_type);
或者
CxMemFile memfile((BYTE
  *  )buffer,size);
CxImage image(
  &  memfile,image_type);
或者
CxMemFile memfile((BYTE
  *  )buffer,size);
CxImage
  *  image  =  new  CxImage();
image
  ->  Decode(  &  memfile,type);

  如何对内存中的图像编码 

long  size  =  0  ;
BYTE
  *  buffer  =  0  ;
image.Encode(buffer,size,image_type);
...
image.FreeMemory(buffer);
或者
CxMemFile memfile;
memfile.Open();
image.Encode(
  &  memfile,image_type);
BYTE
  *  buffer  =  memfile.GetBuffer();
long  size  =  memfile.Size();
...
image.FreeMemory(buffer);

  如何创建一副多页的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);
或者
FILE
  *  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) 
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();

  如何在图片框控件(Picture Box)中显示图像 

HBITMAP m_bitmap  =  NULL;
CxImage image(
  "  myfile.png  "  , CXIMAGE_FORMAT_PNG);
...
CDC
  *  hdc  =  m_picture.GetDC();
HBITMAP m_bitmap 
=  image.MakeBitmap(hdc  ->  m_hDC);
HBITMAP hOldBmp 
=  m_picture.SetBitmap(m_bitmap);
if  (hOldBmp) DeleteObject(hOldBmp);
if  (hdc  ->  m_hDC) m_picture.ReleaseDC(hdc);
...
if  (m_bitmap) DeleteObject(m_bitmap);

 

Cimage合并图片就是这么简单:

       CxImage t_img1,t_img2,t_img3;

       int t_h1,t_w1,t_h2,t_w2,t_h3,t_w3,t_bpp;

       t_img1.Load("F://1.jpg");

       t_img2.Load("F://2.jpg");

       t_h1=t_img1.GetHeight();

       t_w1=t_img1.GetWidth();

       t_h2=t_img2.GetHeight();

       t_w2=t_img2.GetWidth();

       t_h3=t_h1;

       t_w3=t_w1+t_w2;

       t_bpp=t_img1.GetBpp();

       t_img3.Create(t_w3,t_h3,t_bpp);

       t_img3.MixFrom(t_img1,0,0);

       t_img3.MixFrom(t_img2,t_w1,0);

       t_img3.Save("f://3.jpg",CXIMAGE_FORMAT_JPG);

 

译后序:

  关于图像处理库,我相信大家有一个共同的疑问:这么多图像处理库,我该如何选择?在CSDN的blog中有这样一段文字,比较透彻地回答了这个问题,感谢作者的透彻解释:

  "CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所 束缚。

  在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂 着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封 装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。"



 类似资料:

相关阅读

相关文章

相关问答