查了相关资料,帖子上有以下这个方法。原理是,用BinaryWriter手写一个ICO格式的文件头,然后直接把png文件数据copy进去。如下,但是问题来了。确实能够转换成功,但是windows下预览是OK的

用看图王软件打开是乱码

然后window自带的画图打开是正常的,如预览。
如果光这样也就罢了,问题是我把做的ICO作为软件的Icon,安装到电脑上之后就不显示了!这就很尴尬。这才是我真正需要的。
我用了原版的png用在线工具转换出来的ico,看图王正常显示,作为软件Icon也能正常显示。
我比对了自作ico和在线转换ico的2进制文件(同一个png转换,同样64*64),发现前面头是相同的,但是里面的图片数据不同了
从86位开始就开始有不同了

请教问题出哪里了么?
转换代码如下,网上查到的,用了有错误,我杠掉了,结果如上
Image image = new Bitmap(new Bitmap(origin), iconSize); //先读取已有的图片为bitmap,并缩放至设定大小
MemoryStream bitMapStream = new MemoryStream(); //存原图的内存流
MemoryStream iconStream = new MemoryStream(); //存图标的内存流
image.Save(bitMapStream, ImageFormat.Png); //将原图读取为png格式并存入原图内存流
BinaryWriter iconWriter = new BinaryWriter(iconStream); //新建二进制写入器以写入目标图标内存流
iconWriter.Write((short)0); //0-1保留
iconWriter.Write((short)1); //2-3文件类型。1=图标, 2=光标
iconWriter.Write((short)1); //4-5图像数量(图标可以包含多个图像)
iconWriter.Write((byte)image.Width); //6图标宽度
iconWriter.Write((byte)image.Height); //7图标高度
iconWriter.Write((short)0); //8颜色数(若像素位深>=8,填0。这是显然的,达到8bpp的颜色数最少是256,byte不够表示)
iconWriter.Write((short)0);//9保留。必须为0
// iconWriter.Write((short)0); //10-11调色板 这条要去掉,不然会报错
iconWriter.Write((short)32); //12-13位深
iconWriter.Write((int)bitMapStream.Length);//14-17位图数据大小
iconWriter.Write(22);//18-21位图数据起始字节
//写入图像体至目标图标内存流
iconWriter.Write(bitMapStream.ToArray());
//保存流,并将流指针定位至头部以Icon对象进行读取输出为文件
iconWriter.Flush();
iconWriter.Seek(0, SeekOrigin.Begin);
Stream iconFileStream = new FileStream(destination, FileMode.Create);
Icon icon = new Icon(iconStream);
icon.Save(iconFileStream); //储存图像
/**
* 下面开始释放资源
*/
iconFileStream.Close();
iconWriter.Close();
iconStream.Close();
bitMapStream.Close();
icon.Dispose();
image.Dispose();
return File.Exists(destination);