我想根据伟大的favicon备忘单创建多文件favicon.ico。
我创建了 3 个 .png 文件,使用 OptiPNG 对其进行了优化,并收到了 1、2 和 3kb 大小的文件。
现在我尝试使用 Imagemagick 从它们创建 favicon.ico,但最终文件约为 15kb 大(组件文件的总和约为 6kB)。
是什么导致了这种影响以及如何避免它?
解决方法是依赖 HTTP gzip 压缩。
例如,我将3张PNG图片(总共3580字节)打包在一个15086字节的
favicon.ico
文件中。当我在服务器端启用 gzip 压缩的情况下下载它时,我得到了 2551 字节的数据。这比一张一张下载 PNG 图片更有效率,因为这种文件通常不启用 gzip。
但是,gzip 通常不为
.ico
文件配置(这更多是针对文本文件)。在 Apache 上,可以通过添加来解决此问题:
<IfModule mod_deflate.c>
(... other rules here...)
AddOutputFilterByType DEFLATE image/x-icon
</IfModule>
在 Apache 配置文件中,例如
/etc/apache2/mods-available/deflate.conf
。
这不是你期望的答案,我希望有人能用神奇的命令行来产生我们应得的轻量级
favicon.ico
!
另一个解决方法是使用其他工具来创建 favicon 文件。
我找到了(在 ofc 堆栈上;))png2ico 工具。它给了我 8kb 文件(组件总和约为 6),这是我可以忍受的大小。
请阅读对此答案的评论 - philippe_b 观察到有时 png2ico 会给他带来糟糕的结果。
只有256x256 32位图标是PNG压缩的,其他图标都作为经典图标存储在.ICO文件中。因此,文件大小会自然增加,因为它将解压缩其他较小尺寸的图标。
您可以通过简单的 Python 脚本将 PNG 组合到 ICO 中:
png2ico.py 1.png 2.png -o out.ico
import argparse
import struct
import io
import PIL.Image
def main():
ap = argparse.ArgumentParser()
ap.add_argument('inputs', nargs='+')
ap.add_argument('-o', '--output', required=True)
args = ap.parse_args()
pngs = []
for path in args.inputs:
with open(path, 'rb') as fp:
pngs.append(fp.read())
headers = []
headers.append(struct.pack('<HHH', 0, 1, len(pngs)))
offset = 6 + 16 * len(pngs)
for data in pngs:
with PIL.Image.open(io.BytesIO(data)) as im:
w, h = im.size
headers.append(struct.pack('<BBBBHHII', w, h, 0, 0, 1, 0, len(data), offset))
offset += len(data)
with open(args.output, 'wb') as fp:
fp.truncate()
fp.write(b''.join(headers + pngs))
main()