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

简介: 一、背景 笔者在项目的开发中,需要调用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:将单元测试过的代码合入工程代码模块中,前提是单元测试无误。


相关文章
|
安全 网络协议 数据安全/隐私保护
|
12天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
379 133
|
11天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
474 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
5天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
212 138
|
11天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
455 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
5天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
230 136
|
22天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1548 87