天天看點

十全大補: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+來說,這一點使我們可以進一步學習各種編解碼技術,而不再浮于各種技術的表面。"