C# 将图像转ICON格式

    public bool ConvertToIconEmguCV(string imagePath, string iconPath, int size)
        {
            using var bmp = ConvertToPng(imagePath);
            using var bmp2 = new Bitmap(bmp, new Size(size, size));
            var icon = ToIcon(bmp2);
            using Stream iconFileStream = new FileStream(iconPath, FileMode.Create);
            icon.Save(iconFileStream); //储存图像
            return File.Exists(iconPath);
        }
        private Icon ToIcon(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);
        }
        private Bitmap ConvertToPng(string imagePath)
        {
            using var bitmap = new Bitmap(imagePath);
            using MemoryStream memoryStream = new MemoryStream();
            bitmap.Save(memoryStream, ImageFormat.Png);
            Bitmap pngBitmap = new Bitmap(memoryStream);
            return pngBitmap;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值