最近我收到了上级的一个需求,我们需要使用产品的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. P3588 【[POI2015]PUS】(线段树优化建边)

    P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...

  2. P1516 青蛙的约会和P2421 [NOI2002]荒岛野人

    洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...

  3. 关于MySQL数据库的卸载

    首先对于MySQL这款数据库来讲,不能简单的卸载就草草了事,我们首先在mysql的文件下面找到my.ini这个文件, 在其中找到mysql数据库所产生的data文件,这个文件一般在c盘的一个隐藏目录下 ...

  4. Codeforces Round #575 (Div. 3) 昨天的div3 补题

    Codeforces Round #575 (Div. 3) 这个div3打的太差了,心态都崩了. B. Odd Sum Segments B 题我就想了很久,这个题目我是找的奇数的个数,因为奇数想分 ...

  5. 系统通配符号、系统正则符号,grep

    系统通配符号.系统正则符号,grep 1 系统通配符号 系统通配符号:借助通配符号 匹配文件名称信息 1.1 *: 匹配所有(任意)字符信息 找寻以old开头的文件 find /oldboy -typ ...

  6. 使用Pandas读取CSV文件

    使用Pandas读取CSV文件 import pandas as pd csv_data = pd.read_csv('birth_weight.csv') # 读取训练数据 print(csv_da ...

  7. 仿真FFT(quartus安装)

    软件下载:http://dl.altera.com/13.1/?edition=subscription 安装步骤: 接下来,仿真FFT: http://www.openhw.org/article/ ...

  8. [hdu5255]枚举

    思路:这题与csu1392题目类似,方法类似.枚举最高位,最低位和中间数字的长度,然后列等式,计算中间的数字,看长度是不是跟枚举的一致,需要注意的是中间数字可以有前导0,如果根据等式算出来的中间数字为 ...

  9. Semaphore和AQS

    Semaphore意思的信号量,它的作用是控制访问特定资源的线程数量 构造方法: public Semaphore(int permits) public Semaphore(int permits, ...

  10. 容器技术之LXC

    什么是容器?在生活中我们常见的容器有各种瓶瓶罐罐.各种能够容纳其它物料的东西叫容器:容器的特点就是有着很好的隔离作用,使得不同的物料互相隔离:除此之外容器还方便运输.方便储存:这是生活中所说的容器,以 ...