最近我收到了上级的一个需求,我们需要使用产品的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图标的更多相关文章

  1. FilterFactory是一款将图片转换成SVG的在线生成工具。

    FilterFactory是一款将图片转换成SVG的在线生成工具. FilterFactory 彩蛋爆料直击现场 FilterFactory是一款将图片转换成SVG的在线生成工具.

  2. centos下 将(jgp、png)图片转换成webp格式

    由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...

  3. 使用CSS将图片转换成黑白(灰色、置灰)z转

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  4. [转]C#将image中的显示的图片转换成二进制

    本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...

  5. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...

  6. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  7. [转] 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果 ---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3804 去年盛夏之时, ...

  8. C#将image中的显示的图片转换成二进制

    原文:C#将image中的显示的图片转换成二进制 1.将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才 ...

  9. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

随机推荐

  1. 惠普 HP Pavilion 15 Notebook PC清灰教程总结 惠普g4系列清灰加内存条教程

    最近天气热的电脑都受不了,风扇总是异响,声音很大,感觉是散热不行了,就把电脑清一下灰,虽然之前也清过,但是基本都忘记了,机子比较老,找不到具体教程,清灰过程中因为不熟悉有点费劲,手动记录一下,方便下次 ...

  2. tinymce富文本编辑器整合到django

    第一步:定义表存图片路径 models.py class AdminIMG(models.Model):     filename = models.CharField(max_length=200, ...

  3. 用Navicat建MySQL数据库表,动态改变创建时间和更新时间戳

    1.create_time 记录创建的时间,设默认值为:CURRENT_TIMESATMP 注意:不勾选那个[根据当前时间戳更新] 2.operator_time 更新记录的时间,勾选那个[根据当前时 ...

  4. A. Guest From the Past(数学推式子)

    \(n元,买塑料杯子a元,买玻璃杯子b元,但玻璃杯子用完后可以卖c元\) \(求最多买的杯子.\) \(---------------------------分割------------------- ...

  5. boost在Qt中的使用

    一.说明 理论上,Qt和boost是同等级别的C++库,如果使用Qt,一般不会需要再用boost,但是偶尔也会有特殊情况,比如,第三方库依赖等等.本文主要介绍boost在windows Qt(MinG ...

  6. NLTK数据包下载频繁报错——解决方法

    问题描述:Nltk下载数据包,安装频繁报错. import nltk nltk.download() 运行上面的代码,下载nltk的数据包.但是在下载过程中因为各种问题导致网络传输失败,下载不成功. ...

  7. STM32 标准库3.5修改默认外部8M晶振为16M晶振

    ST官方标准库V3.5默认的外部晶振频率为8M,实际使用中外部晶振需要修改为16M: 经过实验,修改有效,具体的patch如下: 修改 HSE_VALUE 值 diff --git "a/L ...

  8. Spring Cloud认知学习(一):Spring Cloud介绍与Eureka使用

    目录 Spring Cloud的介绍 微服务的介绍 Spring Cloud出现的原因: 常见场景: 微服务的优劣势: Spring Cloud版本问题 版本介绍 与Spring Boot版本对应关系 ...

  9. js canvas压缩图片和jQuery ajax上传图片简单demo

    原来用的插件,里面东西太乱了,一会jq,一会原生js,本来原生js就不熟,看起来更难受,而且感觉好多东西都是没用的,而且后端php转存文件一直不是很熟悉,正好一起整理一下.就是很简单的一个demo,如 ...

  10. 弹弹弹 打造万能弹性layout

    demo地址:https://github.com/cmlbeliever/BounceLayout 最近任务比较少,闲来时间就来研究了android事件传播机制.根据总结分析的结果,打造出万能弹性l ...