[工具-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 : 存的是训练集的标签 ...
随机推荐
- centos8-django项目部署 nginx+uwsgi
1.虚拟环境virtualenv安装 1.安装virtualenv pip3 install virtualenv 2.创建目录,把项目文件传过来 mkdir My cd My 3.创建独立运行环境- ...
- 记jmeter接口测试动态获取验证码
在用jmeter做接口测试时,需要动态的获取验证码,以便在登录成功后可以获取token,但是在测试的过程中,遇到了一个问题,想在这里给大家分享一下: 环境描述 在获取验证码的http请求下加后 ...
- 【Hadoop离线基础总结】Apache Hadoop的三种运行环境介绍及standAlone环境搭建
Apache Hadoop的三种运行环境介绍及standAlone环境搭建 三种运行环境 standAlone环境 单机版的hadoop运行环境 伪分布式环境 主节点都在一台机器上,从节点分开到其他机 ...
- JUC之ReentrantLock源码分析
ReentrantLock:实现了Lock接口,是一个可重入锁,并且支持线程公平竞争和非公平竞争两种模式,默认情况下是非公平模式.ReentrantLock算是synchronized的补充和替代方案 ...
- CF-292D Connected Components 并查集 好题
D. Connected Components 题意 现在有n个点,m条编号为1-m的无向边,给出k个询问,每个询问给出区间[l,r],让输出删除标号为l-r的边后还有几个连通块? 思路 去除编号为[ ...
- search(13)- elastic4s-histograms:聚合直方图
在聚合的分组统计中我们会面临两种分组元素类型:连续型如时间,自然数等.离散型如地点.产品等.离散型数据本身就代表不同的组别,但连续型数据则需要手工按等长间隔进行切分了.下面是一个按价钱段聚合的例子: ...
- Spring全家桶之spring boot(四)
spring boot拦截器.过滤器.servlet和健康检查机制 spring boot拦截器 spring boot配置拦截器与原来大致相同,只是需要在拦截器的配置类上添加@Configurat ...
- 使用windows(win7和win10),最好用chocolatey
Win10平台使用PowerShell命令行choco来安装所需开源软件. 步骤如下: 打开Chocolatey 官方网站,The package manager for windows,这很巨硬. ...
- nginx之启停操作及配置文件语法检测
nginx的启停操作 ----nginx 启动 ----nginx -s stop 停止 ----nginx -s reload 重新加载 nginx -t 修改配置文件之后进行语法检验
- linux常用命令---系统辅助命令
系统辅助命令