多文件 favicon.ico 比组件文件大小的总和大得多

问题描述 投票:0回答:4

我想根据伟大的favicon备忘单创建多文件favicon.ico。
我创建了 3 个 .png 文件,使用 OptiPNG 对其进行了优化,并收到了 1、2 和 3kb 大小的文件。
现在我尝试使用 Imagemagick 从它们创建 favicon.ico,但最终文件约为 15kb 大(组件文件的总和约为 6kB)。
是什么导致了这种影响以及如何避免它?

favicon imagemagick-convert
4个回答
2
投票

解决方法是依赖 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


1
投票

另一个解决方法是使用其他工具来创建 favicon 文件。
我找到了(在 ofc 堆栈上;))png2ico 工具。它给了我 8kb 文件(组件总和约为 6),这是我可以忍受的大小。

请阅读对此答案的评论 - philippe_b 观察到有时 png2ico 会给他带来糟糕的结果。


0
投票

只有256x256 32位图标是PNG压缩的,其他图标都作为经典图标存储在.ICO文件中。因此,文件大小会自然增加,因为它将解压缩其他较小尺寸的图标。


0
投票

您可以通过简单的 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()
© www.soinside.com 2019 - 2024. All rights reserved.