最近我收到了上级的一个需求,我们需要使用产品的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
时间: 2024-10-27 07:23:33