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. 0x15 KMP

    这个算法本身就不难. poj1961 #include<cstdio> #include<iostream> #include<cstring> #include& ...

  2. 【SDOI 2016】 排列计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...

  3. Java-杂项: Java中Array和ArrayList区别

    ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...

  4. thinkPHP5 报错session_start(): No session id returned by function解决方法

    这是因为用Redis接管了session状态储存,但是Redis又连接不正常导致的 在服务器上查看Redis运行状态一切正常,set.get也没有问题,最后琢磨了半天才发现是PHPRedis扩展没有安 ...

  5. Noip蒟蒻专用模板

    目录 模板 数论 线性筛素数 线性筛欧拉 裴蜀定理 卢卡斯定理 矩阵快速幂 逆元 高斯消元 图论 割点 最小生成树 倍增 SPFA 负环 堆优化迪杰斯特拉 匈牙利 数据结构 树状数组 ST表 线段树 ...

  6. extjs 与html相结合 自定义

    http://skirtlesden.com/articles/html-and-extjs-components

  7. QT-项目文件说明

    前言:如题. 一.项目文件概述 文件 功能 helloworld.pro 包含了项目信息 helloworld.pro.user 用户信息 hellodialog.h 自定义类hellodialog的 ...

  8. SSH三个主流框架环境的搭建

    part 1  Hibernate环境的搭建 part2  struts2环境的搭建 第一步:从struts2官网下载需要的各种资料和jar包 第二步:在ecplise里面创建web项目,然后在web ...

  9. Win10 UI入门 pivot multiable DataTemplate

    this is a dynamic pivot with sliderable navigation and multiableDatatemplate Control 看了 alexis 大哥的pi ...

  10. idea报错:Please, configure Web Facet first!

    https://blog.csdn.net/handsomepig123_/article/details/87257689  转载