塔克茜丝 2023-09-27 09:32 采纳率: 0%
浏览 17

C# PNG无损转的ICO显示异常,如何解决?

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

img

用看图王软件打开是乱码

img

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

img


请教问题出哪里了么?

转换代码如下,网上查到的,用了有错误,我杠掉了,结果如上


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);
  • 写回答

2条回答 默认 最新

  • 赵4老师 2023-09-27 14:18
    关注

    升级pillow库

    评论

报告相同问题?

问题事件

  • 创建了问题 9月27日