C# 图片转换ICO工具

        以前总是喜欢用在线的方法将图片转换ICO文件。要是没网就是没办法了。所以做了一个软件工具。将BMP,JPG,PNP,GIF.ICO转换为规定大小的ICO文件。

1.文件格式判断

不通过文件扩展名而是通过二进制文件头进行格式判断。

        /// <summary>
        /// 通过读取文件头,判断是否为图片格式,并输出至typename
        /// </summary>
        /// <param name="typename">图片格式</param>
        /// <param name="filePath">文件路径</param>
        /// <returns>是否为指定的几种图片格式</returns>
        private bool IsPicture(out string typename, string filePath)
        {
            try
            {
                FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                BinaryReader reader = new BinaryReader(fs);
                string fileClass = "";
                byte[] cb = new byte[6];
                cb = reader.ReadBytes(6);
                if (cb[0] == 0)
                {
                    foreach (var bs in cb)
                    {
                        fileClass += bs.ToString();
                    }
                }
                else {
                    for (int i = 0; i < 2;i++ )
                    {
                        fileClass += cb[i].ToString();
                    }
                }
                reader.Close();
                fs.Close();
                if (
                    fileClass == FILEHEAD_BMP
                    || fileClass == FILEHEAD_JPG
                    || fileClass == FILEHEAD_PNG
                    || fileClass == FILEHEAD_GIF
                    || fileClass == FILEHEAD_ICO
                    )
                {
                    typename = fileClass;
                    return true;
                }
                else
                {
                    typename = "";
                    return false;
                }
            }
            catch
            {
                typename = "";
                return false;
            }
        }


2.转换Image为Icon

这个代码我也是从网上找的,也不知道原创是谁了,因为很多文章都有。

        /// <summary>
        /// 转换Image为Icon
        /// </summary>
        /// <param name="image">要转换为图标的Image对象</param>
        public static Icon ConvertToIcon(Image image )
        {
            if (image == null)
            {
                 return null; 
            }

            using (MemoryStream msImg = new MemoryStream()
                              , msIco = new MemoryStream())
            {
                image.Save(msImg, ImageFormat.Png);

                using (var bin = new BinaryWriter(msIco))
                {
                    //写图标头部
                    bin.Write((short)0);           //0-1保留
                    bin.Write((short)1);           //2-3文件类型。1=图标, 2=光标
                    bin.Write((short)1);           //4-5图像数量(图标可以包含多个图像)

                    bin.Write((byte)image.Width);  //6图标宽度
                    bin.Write((byte)image.Height); //7图标高度
                    bin.Write((byte)0);            //8颜色数(若像素位深>=8,填0。这是显然的,达到8bpp的颜色数最少是256,byte不够表示)
                    bin.Write((byte)0);            //9保留。必须为0
                    bin.Write((short)0);           //10-11调色板
                    bin.Write((short)32);          //12-13位深
                    bin.Write((int)msImg.Length);  //14-17位图数据大小
                    bin.Write(22);                 //18-21位图数据起始字节

                    //写图像数据
                    bin.Write(msImg.ToArray());

                    bin.Flush();
                    bin.Seek(0, SeekOrigin.Begin);
                    return new Icon(msIco);
                }
            }
        }

3.界面

拖几个按钮,label,panel,设置主窗体允许拖拽文件,几个事件,等等。工具类经常要置顶功能所以加了置顶开关。界面如下:



设置需要输出的ICO大小,然后把一张图片拖进窗体或者通过按钮打开,就可以转换,保存为ICO了。


ps:有个问题,就是文件名太长的话,状态栏会不显示!而不是只显示一部分,真奇葩。

PS:加上源码打包下载

http://download.csdn.net/download/wangzibigan/10216891



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值