[工具-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

时间: 2024-10-27 07:23:33

[工具-002]把png图片转换成ico图标的相关文章

MFC将图片转换成ico文件

#include "atlimage.h" HICON ToIcon(int cx,int cy) { CImage img; img.Load("cap.bmp");//可以是jpg,png,gif格式图片 int w = img.GetWidth(); int h = img.GetHeight(); CDC * dc = CDC::FromHandle(GetWindowDC(GetDesktopWindow())); CDC mdc; mdc.CreateC

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

由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透明图层的图片,但是尺寸和内存确跟转换成功的文件一般无二. 初想,可以找个办法判断一下图片是否无效的,网上找各种办法,结果无果.虽然失败了但是还是上一下代码,期待大神能协助完善方法. function imgToWebp($file=''){ if(is_file($file)){ $img = ge

手机上怎么将图片转换成PDF

当我们在网上找到很多不同的图,想要将它制作成一个相册时会怎么做呢?其实最简单的方法是将图片转换为PDF文件,也是为了更好的储存图片,更好的阅览文件,将图片转换成PDF文件是最好的方法,下面就将方法分享给大家. 转换工具介绍:它是一款提供免费文件格式转换的办公应用.支持一键完成PDF文件与Office.HTML.TXT和图片文档之间的格式转换,轻巧简便,快速转换,每天转换文档数量100000+,是移动办公方面优秀的文件格式转换小助手! 转换方法: 第一步:首先在手机的软件商店找到转换工具,然后运行

图片转换成文字并导出的方法

一般我们如果想要把一张图片转换成文字,最常用的方法就是对照着图片将里面的文字手动敲打出来.但是,大家都知道,如果图片上的文字太多了话,手动敲打文字这种方法就不适用了.现在给大家分享一个简单的方法,将图片转换成文字并导出,用手机就可以轻松实现.一.准备工作:将需要识别的文字用手机拍照,如果是网上的资料.文章,可截屏保存,如果是图片上的文字,可直接保存图片.二.找到"迅捷文字识别"这个OCR文字识别工具这是一个可以识别图片上的文字的手机应用,可以将图片上的长篇文字很快识别成文本,在手机上的

如何扫描识别图片转换成文字

怎么将图片转换成文字的呢?一般大家可能首先想到的是使用手动打字的方式进行转换,但是这种方法简单太麻烦了,小编是不推荐大家这样去做的,那还有其它便捷的方法呢?当然是有的,接下来的这篇文章就来为大家了解下扫描识别图片转文字的方法. 操作步骤: 1:将电脑中的OCR文字识别软件打开,关闭弹窗点击上方导航栏图片局部识别板块. 2:进入图片局部识别版块后,点击添加文件按钮即可将所需转换的图片添加进来. 3:图片添加完成后,有需要的话可以利用下方一排小工具来简单对图片做一下调整,工具的作用分别是"移动位置&

如何识别图片转换成文字,具体步骤讲解

将图片转换成文字大家可能首先想到的便是手动打字的方法,但是为了提高工作效率,还是不建议大家采取这种方法,其实通过使用一些文字识别软件就可以识别图片转换成文字了,下面跟着小编一起来看看具体的操作步骤吧! 操作步骤: 1:将所需识别的文字图片在电脑中准备好,接着下载安装一款支持图片文字识别的软件,小编在这里就选择一种. 2:双击桌面图标将安装好的软件打开,点击上方导航栏图片局部识别板块. 3:进入图片局部识别版块后,接着点击添加文件按钮选择一张所需识别的图片并打开,注意在这里支持识别的几种图片格式.

怎么把图片转换成word?

不知道大家平时会不会看书,小编最近又买了10本书,准备充实一下自己的生活.在读书的过程中,可以丰富自己的见识,又能增加一些文学素养,可以在我们的写作中为我们带来一些灵感.当我们读到一段喜欢的话的时候,可以通过拍照的形式,将一些内容转换成word的形式汇总保存起来.那么今天呢,小编就把图片转换成word的操作分享给大家. 第一步:我们在完成图片转文字的时候需要借助一款工具来辅助我们,大家可以在百度里搜索OCR文字识别,找到我们需要的OCR文字识别工具,下载到我们的电脑里. 第二步:安装完成,可以打

怎样快速把jpg图片转换成word文档?

在日常的生活或者是工作中我们经常见到的图片就是jpg格式的了,无论是在哪个方面,我们都会多多少少的遇到将图片转换成文字的情况发生.在高中的时候,就经常有些jpg图片需要转化的.可是一直没有找到好的转换方法.今天小编将这个好用的方法分享给大家. 具体操作: 第一步:小编的电脑里有OCR文字识别软件工具,没有该工具的小伙伴们,就需要在浏览器中搜索并下载到我们的电脑里了. 第二步:打开OCR文字识别软件,在我们的电脑上自动弹出该工具的界面.并且在页面左侧可以看到该工具的功能板块.小编需要的是jpg图片

照片转成pdf 如何把jpg图片转换成pdf格式

大家不知道还记不记得,那句台词"好男人就是我,我就是xxx"曾小贤.没错就是他<爱情公寓>毫无疑问近几年比较有特点的喜剧了,而且每个人都在盼望着第五季.尤其是到第四部结尾的时候,大家都希望曾小贤能和一菲在一起,在这时候它结束了,我们都幻想着爱情公寓第五季,可是迟迟没有音信.大家依然还记得子乔的小姨妈.楼下的小黑.婉瑜.展博. 这群年轻人跟现实生活中的我们一样,过着合租群租的生活,我们没有他们那么多的欢声笑语,可能这就是电视剧和现实差距,当我们最爱的几位主演都有了自己新的工作