不同格式图片相互转换的开源库分享
一、背景
笔者在项目的开发中,需要调用windows下的COM接口SetIconLocation来实现桌面快捷方式。而我们项目中给定的图片格式为png格式,SetIconLocation的接口第一个参数指定必须包含icon(即.ico)类型图标的exe或dll文件或直接是ico文件路径。网上查了好久,没有直接调用png实现快捷方式的接口,但网上格式间相互转换的工具也是很多的(工具需要手动拖选实现,这点项目中也是不允许的)。所以,问题就转嫁为:如何实现png格式图标转化为ico格式图标?
- SetIconLocation的MSDN释义如下:
- SetIconLocation Method
- Sets 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
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!