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

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

一、背景

       笔者在项目的开发中,需要调用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

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

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页