0

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

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

然后我尝试自己实现编码器。基于 ICO 容器的标头描述,我实现了这一点,并且工作起来就像一个魅力,但前提是我使用 png 数据作为有效负载。

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

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

根据一篇文章,我发现当 ico 文件中的格式为 PNG 图像时,它必须与 PNG 标头一起写入。如果它是位图图像,则必须只写入位图的原始数据而没有位图标题。

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

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

4

1 回答 1

0

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

.ico图标文件包含 ICO 标头,但也包含包含图标每个子图像的条目的“目录” 。然后每个子图像都是一个位图对象(带有 Win32 位图标头,但没有 Win32 位图文件标头,是的,这很令人困惑)。

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

于 2012-11-21T00:17:14.653 回答