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

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

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

  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. }

  如何从资源中加载图像

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

如何解码内存中的图像 

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

 如何对内存中的图像编码 

  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

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

如何复制和粘贴图像

  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)中显示图像 

  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合并图片就是这么简单:

  1. CxImage t_img1,t_img2,t_img3;
  2. int t_h1,t_w1,t_h2,t_w2,t_h3,t_w3,t_bpp;
  3. t_img1.Load("F://1.jpg");
  4. t_img2.Load("F://2.jpg");
  5. t_h1=t_img1.GetHeight();
  6. t_w1=t_img1.GetWidth();
  7. t_h2=t_img2.GetHeight();
  8. t_w2=t_img2.GetWidth();
  9. t_h3=t_h1;
  10. t_w3=t_w1+t_w2;
  11. t_bpp=t_img1.GetBpp();
  12. t_img3.Create(t_w3,t_h3,t_bpp);
  13. t_img3.MixFrom(t_img1,0,0);
  14. t_img3.MixFrom(t_img2,t_w1,0);
  15. t_img3.Save("f://3.jpg",CXIMAGE_FORMAT_JPG);

译后序:

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

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

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

cximage功能简介的更多相关文章

  1. DYN-B201 Dynamics CRM 云生产力解决方案与功能简介

    DYN-B201 Dynamics CRM 云生产力解决方案与功能简介 讲师:王健.林松涛Dynamics CRM 云产品正式落地中国,CRM 与 Azure.O365 深度整合无缝集成,带来无与伦比 ...

  2. (视频) 《快速创建网站》 2.3 WordPress初始化和功能简介

    本文是<快速创建网站>系列的第4篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  3. SharePoint 2013 "通知我"功能简介

    功能简介 "通知我"主要是在列表或者文档库里面的项目,有添加/删除/修改等操作,发送邮件通知设置的用户的功能:可以针对列表或者文档库设置通知,也可以针对单一项目设置通知功能,是Sh ...

  4. Beginning SDL 2.0(1) SDL功能简介

    原文链接为 http://wiki.libsdl.org/Introduction. 由于近期整理音视频可视化的技术,发现好久不更新的SDL发布了2.0版本,以前也没有过于关注,这里准备尝试下.了解S ...

  5. HelloX操作系统网络功能简介及使用和开发指南

    HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...

  6. 部分GDAL工具功能简介

    主要转自http://blog.csdn.net/liminlu0314?viewmode=contents 部分GDAL工具功能简介 gdalinfo.exe 显示GDAL支持的各种栅格文件的信息. ...

  7. 全国天气预报信息数据 API 功能简介与代码调用实战视频

    此文章对开放数据接口 API 之「全国天气预报信息数据 API」进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用,并对实战开发进行了视频演示. 1. 产品功能 接口开放了 ...

  8. Hadoop生态圈-Ambari控制台功能简介

    Hadoop生态圈-Ambari控制台功能简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在经历一系列安装过程之后(部署过HDP后我终于发现为什么大家喜欢用它了,部署比CDH简 ...

  9. Redis安装和主要功能简介

    Redis安装和主要功能简介   Redis(https://redis.io/), 是一个内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 安装Redis 我很少在开发机中直接装各种数 ...

随机推荐

  1. iodine免费上网——本质就是利用dns tunnel建立tcp,然后tcp proxy来实现通过访问虚拟dns0网卡来访问你的dns 授权server

    我的命令: server端: sudo iodined -P passwd -f -DD 10.0.0.100 abc.com client端(直连模式,-r表示使用xxx.abc.com的xxx来转 ...

  2. Ubuntu桌面基础介绍

    1. 目录结构和文件系统 ubuntu的文件系统也是一个又层次的树形结构,文件系统的最上层是 / ,表示根目录,所有其他文件和目录都位于跟目录下,在linux中,一切皆为文件,包括硬盘.分区和拔插介质 ...

  3. gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)

    可逆方阵 A 的逆记为,A−1,需满足 AA−1=I. 在 BLAS 的各种实现中,一般都不会直接给出 matrix inverse 的直接实现,其实矩阵(方阵)的逆是可以通过 gemm()和gesv ...

  4. ROS中安装任意版本的OPENCV

    转自:http://tieba.baidu.com/p/5023000237 安装 Opencv 3.2 on Ubuntu 16.04 并创建node测试 step 1: 安装一些package s ...

  5. inotify-tools+rsync实时同步文件安装和配置

    服务器A:论坛的主服务器,运行DZ X2论坛程序;服务器B:论坛从服务器,需要把X2的图片附件和MySQL数据实时从A主服务器实时同步到B服务器.MySQL同步设置会在下一编中说到.以下是用于实时同步 ...

  6. Unity3D项目

    Input.mousePosition //鼠标点击的位置 0 左键  1右键  2滚轮 Input.GetMouseButton(0) //当鼠标左键处于按下状态的时候返回True Input.Ge ...

  7. SpringBoot(十) 异步任务,定时任务和邮件任务

    异步任务 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的 ...

  8. Java NIO(五)套接字通道

    Socket通道 Socket通道和文件通道有着不一样的特征: Socket通道类可以运行于非阻塞模式,并且是可选的.这两个特征可以激活大程序(如网络服务和中间件组件)巨大的可伸缩性和灵活性,因此再也 ...

  9. Linux常见后缀缩写含义

    ctl: control rc: run control (A run-control file is a file of declarations or commands associated wi ...

  10. js单体内置对象

    js单体内置对象:js的内置对象,是ECMAScritp提供的.不依赖于宿主环境的对象,我的理解就是在我们开发之前js里面就已经存在的对象.单体内置对象就是是不需要通过new来实例化的,例如我们的st ...