十全大补:CxImage图像处理类库

转载地址:http://tech.it168.com/a2009/0306/267/000000267747_5.shtml

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

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);

  译后序:

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

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

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


你可能感兴趣的:(C++学习)