c#WPF将图片转化为图标文件(*.ico)

           

          下面这个转换ico失真很严重.

            Bitmap icoBitmap = new Bitmap(bitmap, size);
            //获得原位图的图标句柄
            var a = icoBitmap.GetHicon();
            //从图标的指定WINDOWS句柄创建Icon
            
            System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(a);
            icon.Dispose();
            return icon;

 

下面这篇文章准确的分析了ico文件格式结构

文章链接:  https://blog.youkuaiyun.com/ecocn/article/details/11147375

                    //此为伸缩图片
                    var bmp1 = (Bitmap)bmp.GetThumbnailImage(size.Width, size.Height, null, IntPtr.Zero);
                    MemoryStream ms = new MemoryStream();
                    bmp1.Save(ms, ImageFormat.Png);//放入流中
                    var   b=ms.GetBuffer();//获得byte[]
                    var ss=Convert.ToString((b.Length), 16).PadLeft(6,'0');//转成十六进制文本
                    
var  daoshu1= ss.Substring(4, 2);
                    var daoshu2 = ss.Substring(2, 2);
                    var daoshu3 = ss.Substring(0, 2);
byte[] icoStart = {  0x00,  0x00,  0x01,  0x00, 0x01,  0x00,
                      0 ,0 ,//这两个是图片的宽度和高度,但这里没有添加宽高也能正常转换
                        0x00,  0x00,
                        0x01,  0x00,0x20,  0x00,
                        //这里注意是是倒着填的,这个是图片总字节数
                    Convert.ToByte(Hex2Ten(daoshu1 )),Convert.ToByte(Hex2Ten(daoshu2)) 
                ,Convert.ToByte(Hex2Ten(daoshu3)),  0x00,//把十六进制文本转换成十进制,为什么要这么转来转去?????呵呵
                        0x16,  0x00,0x00,  0x00 };
                     //合并数组
                    byte[] icoData = icoStart.Concat(b).ToArray();
                    //取随机文本
                    RandomText rt = new ImageDrawing.RandomText();

            string   fileName = rt.GetPassword(6);
            
                    string IcoPath1 = string.Format(@"C:\Users\Administrator\Desktop\{0}.ico", fileName);
                     //写出bytes
                    File.WriteAllBytes(IcoPath1, icoData );

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值