[工具-002]把png图片转换成ico图标
最近我收到了上级的一个需求,我们需要使用产品的png图片,批量转换成ico图片,然后调用上一篇的方法,替换可执行程序的图标。一开始查看资料的时候,C#有直接可以转成ico图片的方法,很简单。但是生成的质量不敢恭维。后面蔡领导不满意,重新寻找解决办法,找了一些C++代码,实现相当麻烦,也很不方便。后面找到了一个png2ico.exe的东西,然后就想到用C#调用CMD命令来完成。好吧,下面讲讲实现步骤。
/**
* 进行转换
* */
private void btnOk_Click(object sender, EventArgs e)
{
// 选择生成的图标的大小
Boolean is128 = this.chk128.Checked;
Boolean is64 = this.chk64.Checked;
Boolean is48 = this.chk48.Checked;
Boolean is32 = this.chk32.Checked;
Boolean is16 = this.chk16.Checked; if (String.IsNullOrEmpty(txtInputPath.Text.Trim()))
{
MessageBox.Show("请选择文件!!!");
return;
}
if (String.IsNullOrEmpty(txtOutputPath.Text.Trim()))
{
MessageBox.Show("请选择存放路径!!!");
return;
}
// 都没有选择
if (!is128 && !is64 && !is48 && !is32 && !is16)
{
MessageBox.Show("请选择尺寸!!!");
return;
} // 进行转换操作
// 先把要转换的文件拷贝到临时文件夹
if (!Directory.Exists(TEMPFLODER))
Directory.CreateDirectory(TEMPFLODER); string[] filenames = Directory.GetFiles(TEMPFLODER);
// 删除其他文件
foreach (string filename in filenames)
{
File.Delete(filename);
} // 把你指定的文件拷贝进去
string filepath = txtInputPath.Text.Trim();
string filenameNoExt = Path.GetFileNameWithoutExtension(filepath);
string newfilepath = TEMPFLODER + "\\" + Path.GetFileName(filepath);
if (File.Exists(filepath))
{
File.Copy(filepath, newfilepath);
} // 开始进行转换
string outputpath = txtOutputPath.Text.Trim();
if(is128)
{
translateIco(TEMPFLODER, outputpath, 128);
renamefile(outputpath + "\\" + filenameNoExt + ".ico", 128);
}
if(is64)
{
translateIco(TEMPFLODER, outputpath, 64);
renamefile(outputpath + "\\" + filenameNoExt + ".ico", 64);
}
if(is48)
{
translateIco(TEMPFLODER, outputpath, 48);
renamefile(outputpath + "\\" + filenameNoExt + ".ico", 48);
}
if(is32)
{
translateIco(TEMPFLODER, outputpath, 32);
renamefile(outputpath + "\\" + filenameNoExt + ".ico", 32);
}
if(is16)
{
translateIco(TEMPFLODER, outputpath, 16);
renamefile(outputpath + "\\" + filenameNoExt + ".ico", 16);
} // 删除临时文件
if (Directory.Exists(TEMPFLODER))
{
string[] files = Directory.GetFiles(TEMPFLODER);
// 删除其他文件
foreach (string file in files)
{
File.Delete(file);
}
}
} /**
* 文件转储
* */
private void renamefile(String path, int size)
{
if (File.Exists(path))
{
// 指定文件名称
string filename = Path.GetFileNameWithoutExtension(path);
string filenameN = filename + "" + size + ".ico";
// 获取存放路径
string floder = txtOutputPath.Text.Trim();
if (File.Exists(floder + "\\" + filenameN))
File.Delete(floder + "\\" + filenameN);
// 进行路径复制
File.Move(path, floder + "\\" + filenameN);
}
} /**
* 图标转换
* */
private void translateIco(String inputpath, String outputpath, int size)
{
// 第一个参数输入路径 第二个输出路径 第三个图标大小
runcommand("png2ico.exe -i \"" + inputpath + "\" -o \"" + outputpath + "\" -s " + size + " 32bpp -noconfirm");
} /**
* 运行命令
* */
private void runcommand(String command)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
// 不弹出dos窗口
p.StartInfo.CreateNoWindow = true;
// dos工作环境
p.StartInfo.WorkingDirectory = Application.StartupPath;
try
{
p.Start();
Console.WriteLine("command:" + command);
p.StandardInput.WriteLine(command + "&exit");
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
Console.WriteLine("result:" + output); }
catch (Exception e1)
{
Console.WriteLine("error" + e1.Message);
}
}
上面的例子中,我们用到了一个方法,就是把要转换的png拷贝到一个临时目录,在把这个临时目录当成是输入路径,然后指定输出路径进行输出。要这么麻烦的一个主要原因是这个png2ico.exe只认文件夹,不认文件,而且会遍历文件夹下的所有png图片进行转换,所以我们创建一个临时目录去解决这个问题。得出来的结果跟网上的转换器效果一模一样,蔡主管非常满意,我也很开心。上面的代码提供大家参考,可以批评指正。
结语
- 受益,C++能操作的底层更多,学会了打DLL包

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4512674.html
[工具-002]把png图片转换成ico图标的更多相关文章
- FilterFactory是一款将图片转换成SVG的在线生成工具。
FilterFactory是一款将图片转换成SVG的在线生成工具. FilterFactory 彩蛋爆料直击现场 FilterFactory是一款将图片转换成SVG的在线生成工具.
- centos下 将(jgp、png)图片转换成webp格式
由于项目要求需要将jpg.png类型的图片 转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...
- 使用CSS将图片转换成黑白(灰色、置灰)z转
小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...
- [转]C#将image中的显示的图片转换成二进制
本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...
- 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果
去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...
- ABBYY如何把图片转换成pdf格式
在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...
- [转] 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果 ---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3804 去年盛夏之时, ...
- C#将image中的显示的图片转换成二进制
原文:C#将image中的显示的图片转换成二进制 1.将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才 ...
- 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)
前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签 ...
随机推荐
- XCTF练习题-WEB-webshell
XCTF练习题-WEB-webshell 解题步骤: 1.观察题目,打开场景 2.根据题目提示,这道题很有可能是获取webshell,再看描述,一句话,基本确认了,观察一下页面,一句话内容,密码为sh ...
- 使用Python实现批量ping操作
在日常的工作中,我们通常会有去探测目标主机是否存活的应用场景,单个的服务器主机可以通过计算机自带的DOS命令来执行,但是业务的存在往往不是单个存在的,通常都是需要去探测C段的主机(同一个网段下的存活主 ...
- 说一说Web开发中两种常用的分层架构及其对应的代码模型
昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...
- LTE基站开局流程
1.全局参数配置 MOD ENODEB :修改基站 ADD CNOPERATOR: 添加运营商 ADD CNOPERATORTA:添加跟踪区(TA) 2.设备参数配置(机柜.机框.RRU.光纤链 ...
- 如何优雅的使用Fegin去构造通用的服务调用的API
第一步: 创建一个公共的API服务:命名为api(根据自己实际情况进行命名) <?xml version="1.0" encoding="UTF-8"?& ...
- 《C程序设计语言》 练习2-4
问题描述 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除. Write an alternate version of squeeze(s1,s2) t ...
- 如何写好、管好单元测试?基于Roslyn+CI分析单元测试,严控产品提测质量
上一篇文章中,我们谈到了通过Roslyn进行代码分析,通过自定义代码扫描规则,将有问题的代码.不符合编码规则的代码扫描出来,禁止签入,提升团队的代码质量. .NET Core技术研究-通过Roslyn ...
- RxJava之并发处理(SerializedSubject)
在并发情况下,不推荐使用通常的Subject对象,而是推荐使用SerializedSubject,并发时只允许一个线程调用onnext等方法! 官方说明: When you use an ordina ...
- LinkedList源码(add方法)
对于要有扎实的java基础,集合是必须掌握的,而且精读这部分的源码很有用,也很有必要.而LinkedList是在java.util包下,和java.io,java.lang都是比较常用,而且比较简单. ...
- 初识JAVA(学习记录)
Java 1.1Java简介 Java是一种跨平台的,面向对象的程序设计语言.无论是电脑还是手机,到处都运行着JAVA开发的应用程序:JAVA程序可以在任何计算机.操作系统以及支持JAVA的硬件设备上 ...