下面这个转换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 );