使用PHP转换ICO为PNG时出现问题

6

背景:网站图标

我正在编写一个WordPress插件,用于下载网站图标并将其转换为PNG格式:

http://plugins.trac.wordpress.org/browser/wp-favicons/trunk(GPL2)

图标库

问题

在5000个图标中有一个问题(其他都正常...),XOR功能出现了问题。请参见此处的第296行: http://plugins.trac.wordpress.org/browser/wp-favicons/trunk/plugins/filters/inc/class.ico.php(注意:未初始化的字符串偏移量:64)。因此,期望的字符串太小。

示例

一个示例是这个图标:点击此处查看(导航到slatch.com)

问题

有人知道如何解决这个问题吗?或者是否知道另一个好的PHP图标类,可以让我通过get_as_string而不是get_from_file读取.ico(各种类型)?

PS

我已经阅读了以下内容:


1
我已经更新了你的问题标题和标签,希望能够吸引更多的关注。你能否发布更多的示例网站图标? - Charles
1
使用GD库的解决方案可行吗? - Christopher Manning
1
当XOR操作失败时,这意味着它已经是一个PNG文件。只需将其保存为PNG文件即可。 - Mark Tomlin
1
文件本身是否损坏是有可能的吗?我尝试了多个工具,但都无法打开该文件。浏览器可以显示它...但可能是因为它能够优雅地处理损坏或其他情况... - Sergey
4个回答

2
我已经为读取.ico文件编写了一个完全单元测试的软件包,支持1bpp图像(以及嵌入的PNG)- 可在此处找到: https://github.com/lordelph/icofileloader 问题中的.ico链接已失效,但如果有人遇到类似的问题,我很乐意修复该软件包。

2
您发布的示例图标是单色的(1 BPP)。可能该库不支持如此低的颜色深度。

1

1
ICO并不总是PNG格式。大多数浏览器支持使用多种图像格式类型来制作网站图标(带有.ico扩展名),但ICO是一种独立的图像格式。这给操作者的问题增加了歧义,因为他下载的图标可能是许多不同的格式。 - Kevin Peno
是的...现在有很多不同的图标,不仅仅是嵌入PNG的新一代图标。 - edelwater
1
你需要读取文件头来确定它是ico、png还是gif格式。(我不认为有人会将jpg用作ico。)而且我非常确定它不被支持。 - Mark Tomlin

0
该类支持1bpp(单色)ico文件。但是它存在一个错误。它未能考虑每个图像行的填充到4字节(32位)边界,因此小于32像素宽度的图标无法正确解码。
我将为自己修复此问题,但我不确定该怎么做。在这里发布一个补丁吗?

1
你最好将补丁提交给插件作者(可能通过他们在 OP 中链接的 Trac),然后再从这里链接到那里。 - John C
嗨,Ian,太棒了,我从来没有想到过。如果您在某个地方发布了更新的库文件,我会将其替换为我的应用程序中的库。 - edelwater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接