zoukankan      html  css  js  c++  java
  • cximage功能简介

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

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

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

    [cpp] view plain copy
     
    1. CxImage  image;  
    2. // bmp -> jpg   
    3. image.Load( " image.bmp " , CXIMAGE_FORMAT_BMP);  
    4. if (image.IsValid()){  
    5.      if ( ! image.IsGrayScale()) image.IncreaseBpp( 24 );  
    6.     image.SetJpegQuality( 80 );  
    7.     image.Save( " image.jpg " ,CXIMAGE_FORMAT_JPG);  
    8. }  
    9. // png -> tif   
    10. image.Load( " image.png " , CXIMAGE_FORMAT_PNG);  
    11. if (image.IsValid()){  
    12.     image.Save( " image.tif " ,CXIMAGE_FORMAT_TIF);  
    13. }   

      如何从资源中加载图像

    [cpp] view plain copy
     
    1. // Load the resource IDR_PNG1 from the PNG resource type   
    2. CxImage * newImage = new CxImage();  
    3. newImage -> LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),  
    4.                        " PNG " ),CXIMAGE_FORMAT_PNG);  
    5. 或者  
    6. // Load the resource IDR_JPG1 from DLL   
    7. CxImage * newImage = new CxImage();  
    8. HINSTANCE hdll = LoadLibrary( " imagelib.dll " );  
    9. if (hdll){  
    10.     HRSRC hres = FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1), " JPG " );  
    11.     newImage -> LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);  
    12.     FreeLibrary(hdll);  
    13. }  
    14. 或者  
    15. // Load a bitmap resource;   
    16. HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),  
    17.                            MAKEINTRESOURCE(IDB_BITMAP1)));  
    18. CxImage * newImage = new CxImage();  
    19. newImage -> CreateFromHBITMAP(bitmap);   


    如何解码内存中的图像 

    [cpp] view plain copy
     
    1. CxImage image((BYTE * )buffer,size,image_type);  
    2. 或者  
    3. CxMemFile memfile((BYTE * )buffer,size);  
    4. CxImage image( & memfile,image_type);  
    5. 或者  
    6. CxMemFile memfile((BYTE * )buffer,size);  
    7. CxImage * image = new CxImage();  
    8. image -> Decode( & memfile,type);   


     如何对内存中的图像编码 

    [cpp] view plain copy
     
    1. long size = 0 ;  
    2. BYTE * buffer = 0 ;  
    3. image.Encode(buffer,size,image_type);  
    4. ...  
    5. image.FreeMemory(buffer);  
    6. 或者  
    7. CxMemFile memfile;  
    8. memfile.Open();  
    9. image.Encode( & memfile,image_type);  
    10. BYTE * buffer = memfile.GetBuffer();  
    11. long size = memfile.Size();  
    12. ...  
    13. image.FreeMemory(buffer);   


      如何创建一副多页的TIFF

    [cpp] view plain copy
     
    1. CxImage * pimage[ 3 ];  
    2. pimage[ 0 ] =& image1;  
    3. pimage[ 1 ] =& image2;  
    4. pimage[ 2 ] =& image3;  
    5. FILE * hFile;  
    6. hFile = fopen( " multipage.tif " , " w+b " );  
    7. CxImageTIF multiimage;  
    8. multiimage.Encode(hFile,pimage, 3 );  
    9. fclose(hFile);  
    10. 或者  
    11. FILE * hFile;  
    12. hFile = fopen( " c://multi.tif " , " w+b " );  
    13. CxImageTIF image;  
    14. image.Load( " c://1.tif " ,CXIMAGE_FORMAT_TIF);  
    15. image.Encode(hFile, true );  
    16. image.Load( " c://2.bmp " ,CXIMAGE_FORMAT_BMP);  
    17. image.Encode(hFile, true );  
    18. image.Load( " c://3.png " ,CXIMAGE_FORMAT_PNG);  
    19. image.Encode(hFile);  
    20. fclose(hFile);   


    如何复制和粘贴图像

    [cpp] view plain copy
     
    1. // 复制(copy)   
    2. HANDLE hDIB = image -> CopyToHandle();  
    3. if (::OpenClipboard(AfxGetApp() -> m_pMainWnd -> GetSafeHwnd())) {  
    4.      if (::EmptyClipboard()) {  
    5.          if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {  
    6.             AfxMessageBox( " Unable to set Clipboard data " );  
    7. }    }    }  
    8. CloseClipboard();  
    9. // 粘贴(paste)   
    10. HANDLE hBitmap = NULL;  
    11. CxImage * newima = new CxImage();  
    12. if (OpenClipboard()) hBitmap = GetClipboardData(CF_DIB);  
    13. if (hBitmap) newima -> CreateFromHANDLE(hBitmap);  
    14. CloseClipboard();   

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

    [cpp] view plain copy
     
    1. HBITMAP m_bitmap = NULL;  
    2. CxImage image( " myfile.png " , CXIMAGE_FORMAT_PNG);  
    3. ...  
    4. CDC * hdc = m_picture.GetDC();  
    5. HBITMAP m_bitmap = image.MakeBitmap(hdc -> m_hDC);  
    6. HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap);  
    7. if (hOldBmp) DeleteObject(hOldBmp);  
    8. if (hdc -> m_hDC) m_picture.ReleaseDC(hdc);  
    9. ...  
    10. if (m_bitmap) DeleteObject(m_bitmap);   


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

    [cpp] view plain copy
     
    1. CxImage t_img1,t_img2,t_img3;   
    2.   
    3.       int t_h1,t_w1,t_h2,t_w2,t_h3,t_w3,t_bpp;   
    4.   
    5.       t_img1.Load("F://1.jpg");   
    6.   
    7.       t_img2.Load("F://2.jpg");   
    8.   
    9.       t_h1=t_img1.GetHeight();   
    10.   
    11.       t_w1=t_img1.GetWidth();   
    12.   
    13.       t_h2=t_img2.GetHeight();   
    14.   
    15.       t_w2=t_img2.GetWidth();   
    16.   
    17.       t_h3=t_h1;   
    18.   
    19.       t_w3=t_w1+t_w2;   
    20.   
    21.       t_bpp=t_img1.GetBpp();   
    22.   
    23.       t_img3.Create(t_w3,t_h3,t_bpp);   
    24.   
    25.       t_img3.MixFrom(t_img1,0,0);   
    26.   
    27.       t_img3.MixFrom(t_img2,t_w1,0);   
    28.   
    29.       t_img3.Save("f://3.jpg",CXIMAGE_FORMAT_JPG);   


    译后序:

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

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

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

  • 相关阅读:
    swift学习笔记之-析构过程
    swift学习笔记之-错误处理
    swift学习笔记之-类型转换
    swift学习笔记之-构造过程
    day43 数据库学习egon的博客 约束
    day43 数据库知识欠缺的
    day41 python【事物 】【数据库锁】
    day40 python MySQL【四】 之 【索引】【视图】【触发器】【存储过程】【函数】
    day41 mysql 学习 练习题 重要*****
    day39 python 学习 数据库学习 五个约束,数据库设计(一对一,一对多等等)
  • 原文地址:https://www.cnblogs.com/lidabo/p/6923386.html
Copyright © 2011-2022 走看看