不同格式图片相互转换的开源库分享

一、背景

笔者在项目的开发中,需要调用windows下的COM接口SetIconLocation来实现桌面快捷方式。而我们项目中给定的图片格式为png格式,SetIconLocation的接口第一个参数指定必须包含icon(即.ico)类型图标的exe或dll文件或直接是ico文件路径。网上查了好久,没有直接调用png实现快捷方式的接口,但网上格式间相互转换的工具也是很多的(工具需要手动拖选实现,这点项目中也是不允许的)。所以,问题就转嫁为:如何实现png格式图标转化为ico格式图标?

SetIconLocation的MSDN释义如下:
SetIconLocation MethodSets the location ofthe link's icon.object.SetIconLocation(sPath,iIndex)
Parameters【1】sPath Required. String value that contains the fully qualified path of the file that contains the icon.【2】iIndex Required. Integer that is set to the index of the icon in the file specified bysPath.

二、思考的解决方案

自己用windowsAPI实现png转ico,笔者看到ico转png的源码大致是需要GDI的Bitmap类中转,实现比较复杂,且过程不具有可逆性。即靠接口实现有一定难度。

这个时候想到,既然网上有那么多工具,是不是也有开源库的实现?于是就有了CxImage类库的发现与使用。参见:http://www.codeproject.com/Articles/1300/CxImage

三、CxImage类库的功能

CxImage是一个可以用于MFC的C++类库(其工程是用dsw格式,vc6.0可以打开使用),其可以打开,保存,显示,转换各种格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG,ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。具体支持格式、定义、需要的库及大小如下:

四、CxImage类库的使用

Step1:下载文档后,用VC6打开,编译运行工程下面包含的子工程,以生成我们需要的库如png.lib等。工程为节省空间,默认是没有编译过的。

Step2:在VC的编译选项中做如下设置——

1)ProjectSetting--> C/C++-->CodeGeneration-->Use run-time library : MultithreadedDLL (must be the same for all the linked libraries);

2)ProjectSetting--> C/C++--> Precompiledheaders—> not using precompiled headers; 如果需要包含的话,手动在添加进工程的Cximage源码的每个.cpp和.h文件中加入#include<stdafx.h>也没有问题(笔者已经试验过)。

3)ProjectSetting--> C/C++--> Preprocessor—> AdditionalInclude Directories:  ..\cximage,即包含进去我们需要添加的目录名称,以便后续工程中包含头文件,无需写文件路径。

4)ProjectSetting-->Link—>General-->Object/library modules--> png.lib libdcr.lib jpeg.lib zlib.lib tiff.lib jasper.libcximage.lib. 这个我们根据我们的实现功能包含不同的lib文件即可。

Step3:在所有的源码实现中必须包含: #include "ximage.h

五、单元测试CxImage类库的使用

以下测试不同格式转换的实现,分别为bmp转为jpg源码,以及ico转为png源码。笔者已经测试过,没有问题。如果不放心,可以对每个函数加上返回值判定。

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);
}// ico -> png
image.Load("image.png",CXIMAGE_FORMAT_ICO);
if (image.IsValid())
{image.Save("image.tif",CXIMAGE_FORMAT_PNG);
}

其余的CxImage类库的信息(版权、版本、历史、功能细节、下载)等大家可以网络搜索。如果你正在为不同格式类型转化的代码犯愁,不妨试一下CxImage类库!

六、个人总结

对于自己短期内要快速实现的功能,而个人能力和时间有限的情况下,可以考虑借助网络开源的实现,个人总结需要以下几个步骤:

Step1:网络上搜索关键词,看有没有开源的实现。如ico转化为png或者png convert to ico。

Step2:如果有开源实现,则研究其对应文档了解其主要功能。最主要的是,研究其是否包含你所需要的功能?如果没有直接包含,思考转换下后看能否满足需求。

Step3:如果能基本包含我们的功能,则研究开源库,了解如何使用其中的代码、需要加载哪些库、以及如何加载其中的静态或者动态库DLL等。

Step4:进行单元测试,以验证功能,为合入库扫除障碍。

Step5:将单元测试过的代码合入工程代码模块中,前提是单元测试无误。

2014-2-16 pm 18:20 思于家中床前

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/19291469

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

不同格式图片相互转换的开源库分享相关推荐

  1. 【基础学习】GitHub 上100 的 Android 开源库分享

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择 (Best Match) 得到的结果, 然后过滤了跟A ...

  2. 关于Android开源库分享平台,(GitClub)微信小程序的开发体验

    七八月份的深圳一直在下雨,总有人说雨天适合窝在家看书,对于程序开发者来说更是难得的学习机会.我们502工作室的小伙伴利用这个时间学习了一下微信小程序开发,并上线了一个GitClub小程序,目前功能有些 ...

  3. android常用开源库分享

    这次就介绍了这些android开源库,各位有好介绍的可以私信我SinaWeiBo我的博客是慕容博客,欢迎来和我交流 异步ImageView android-smart-image-view和andro ...

  4. qt 运动控制软件 界面_开源库分享----一款跨平台图形界面的百度网盘不限速客户端...

    pan-light pan-light 是一款不限速的百度网盘客户端, 基于 golang + Qt5 开发. 本项意义在于探究 golang 在图形界面客户端; web 服务端; 事件调度, web ...

  5. 【开源库分享】雷电模拟器自动化操作库 C#版本

    LD.CORE 雷电模拟器自动化操作库 Github 功能简介 雷电模拟器管理操作 雷电模拟器ADB命令操作:按键,点击,滑动,输入等 雷电模拟器界面UI XML 文件分析 雷电模拟器地理位置切换 雷 ...

  6. 分享6款优秀的 AR/VR 开源库 – 切切歆语的博客 – CSDN博客

    文章目录[隐藏] 分享6款优秀的 AR/VR 开源库 分享6款优秀的 AR/VR 开源库 2017年12月26日 08:54:47 切切歆语 阅读数:4457 今天,为大家推荐几款优秀的 AR/VR ...

  7. 基于libyuv库的NV12格式图片的缩放

    网上关于使用libyuv库在Linux下对NV12格式进行缩放的教程是在太少了,对于博主这种菜鸡来说简直就是煎熬,因为本人阅读源码的能力实在很差啊!!!但不管怎么样,把这几天所得写下来,希望对大家有帮 ...

  8. 基于MuPDF库实现PDF文件转换成PNG格式图片

    背景 之所以会接触MuPDF是因为,有位群友在Q群里提问,如何将PDF保存为.PNG图片格式.我一看到这个问题,就蒙了,因为我没有接触过类似的项目或程序.但是,作为一群之主的我,还是要给初学者一个答复 ...

  9. 分享一个PyTorch医学图像分割开源库

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:我爱计算机视觉 分享一位52CV粉丝Ellis开发的基 ...

最新文章

  1. 理解LSTM/RNN中的Attention机制
  2. cpu使用率 htop显示_Linux查看CPU和内存使用情况
  3. Cisco学习笔记 CCNP-EIGRP
  4. 使用 MYSQLBINLOG 来恢复数据
  5. 华为p40论坛_华为高端旗舰继续发力!麒麟990 5G+超感知三摄,256GB降价799元
  6. js html form,JavaScript 表单
  7. Atitit .h5文件上传 v3
  8. 自考计算机非笔试英语怎么考,自考中的非笔试课程是什么,怎么进行考核?
  9. web servieces 学习小栗子
  10. matlab中三维非线性拟合,matlab非线性拟合与绘制三维曲面
  11. WebSite设置首页或是加入收藏夹功能
  12. java如何看jdk文档_如何在IntelliJ IDEA中查看JDK外部文档?
  13. 备考OCJP认证知识点总结(一)
  14. 微信小程序内无法播放第三方服务器上的视频资源
  15. Chrome笔试平台 摄像头无法开启 | 摄像头图像黑屏 问题解决
  16. CSDN博客专家申请成功
  17. Java编程思想读书笔记——第七章:复用类
  18. CVE-2012-0158漏洞分析
  19. LOFTER72D94FF8E0603DBE38066DB525285F1C
  20. 苹果cms模板_苹果cms怎么修改网站logo?

热门文章

  1. 教师工作量管理系统设计_关于学生信息管理系统数据库的课程设计
  2. win7系统安装sql server 2000 图解全过程
  3. 【Unity课设】孤岛奇缘 文档 + 源码 + 执行文件(简简单单~)
  4. 12代酷睿游戏本电脑哪个牌子好?游匣G15不容错过
  5. Python变量,常量,基础数据类型,input用户交互
  6. 软件直接爬取数据——以MOOC课程数据为例+现已公开的数据库(网盘分享)
  7. Android源码定制(5)——root指纹定制与抹除
  8. Python文档算法整理
  9. 苹果数据线芯片IC,苹果充电线IC芯片FH152C6
  10. LED驱动程序--可拓展的LED驱动程序