将ICO文件写入具有图标句柄的磁盘

时间:2012-11-20 23:55:25

标签: c# bitmap png imaging ico

我们只想说它是C#中图标图像的句柄。有没有办法将内容保存为磁盘上的有效ICO文件?我已经尝试了一切,但没有运气。

我认为第一个解决方案是基于图标句柄创建一个Bitmap对象,然后将此Bitmap保存为文件ico。问题是.net的实现不起作用,只输出普通的PNG数据。

然后我尝试自己实现编码器。基于ICO容器的标题描述,我实现了它,并且像魅力一样工作,但只有当我使用png数据作为有效载荷时。

如果我使用位图数据(这是想要的),操作系统不会将输出文件识别为有效的.ico文件。

我99%确定问题是我将位图数据写入ICO容器的方式。

基于一篇文章,我发现当ico文件中的格式是PNG图像时,它必须与PNG标头一起写入。如果它是位图图像,则必须只编写位图的原始数据而不使用位图头。

好吧,我尝试的是使用Bitmap对象的Lockbits()函数获取位图数据(作为字节数组)并写入,在ico标题之后,并保存文件。我确信我已经正确地写了标题。但我认为我错过了一些东西,否则

将位图数据写入ico文件的正确方法是什么? 此外,我想知道是否有另一种解决方案将HICON(C#中的INtPtr)句柄的内容写入ico文件。

1 个答案:

答案 0 :(得分:0)

.ico文件不是位图文件(某些程序将它们视为相同,但它们掩盖了与用户的差异)。

.ico图标文件包含ICO标题,但也包含“目录”,其中包含图标每个子图像的条目。然后每个子图像都是一个位图对象(使用Win32位图标题,但不是Win32位图文件标题 ,是的,这是令人困惑的。)

有一些开源代码在此处演示了ico对CodePlex的处理:http://anolis.codeplex.com/SourceControl/changeset/view/69709#930335(请查看Save方法)。