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

简介: 一、背景 笔者在项目的开发中,需要调用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 等格式的文件。具体支持格式、定义、需要的库及大小如下:

image.png

四、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:将单元测试过的代码合入工程代码模块中,前提是单元测试无误。


相关文章
|
Java
Java实现图片转化为pdf
Java实现图片转化为pdf
473 0
|
编解码 Linux vr&ar
如何使用ffmpeg将.m4a 格式转换为 pcma格式
ffmpeg是一款开源的万能媒体格式转换工具。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的
|
存储 计算机视觉 数据格式
OpenCV库、Armadillo库矩阵数据格式互转的方法
本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法~
135 1
OpenCV库、Armadillo库矩阵数据格式互转的方法
|
Python
Python将图片转化成文字
Python将图片转化成文字
154 0
|
Python
Python PDF生成和二进制流转换(FPDF)
Python PDF生成和二进制流转换(FPDF)
449 0
|
Python Windows
python知识点100篇系列(4)-转换图片格式的几种方式
python知识点100篇系列(4)-转换图片格式的几种方式
215 0
python知识点100篇系列(4)-转换图片格式的几种方式
|
前端开发
前端学习案例2-二进制互转2
前端学习案例2-二进制互转2
75 0
前端学习案例2-二进制互转2
|
前端开发
前端学习案例1-二进制互转1
前端学习案例1-二进制互转1
70 0
前端学习案例1-二进制互转1
|
Java
Java实现将视频转换为mp4格式
Java实现将视频转换为mp4格式
1459 0
|
Web App开发 前端开发