天天看點

cximage功能簡介

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

    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   

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

newImage -> CreateFromHBITMAP(bitmap);   

CxImage image((BYTE * )buffer,size,image_type);  

CxMemFile memfile((BYTE * )buffer,size);  

CxImage image( & memfile,image_type);  

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

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.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等等,它們可謂是功能強大,齊全,沒必要用其它的類庫。但我要說,這些類庫基本上沒有免費的,使用這些類庫,你要被這樣那樣的許可協定所束縛。

繼續閱讀