在网上查了一圈这个问题,结论是比较可靠的版本应该是 43 字节,完全符合标准且能被正确解析。
提供参考的网页主要有:
- http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
- https://stackoverflow.com/questions/2570633/smallest-filesize-for-transparent-single-pixel-image
其中有提到按照标准,可以省略 6 字节的全局颜色表,但是这样可能导致不能被正确解析。
还有很多人声称省略更多部分也能被正确渲染,这种就不考虑了。其中有将 LZW 数据减少到 5 字节以下的尝试,特别查阅了一下,找到了一篇 LZW 过程的讲解,写得不是很好懂不过还是能看懂。根据这篇讲解,符合标准的 LZW 数据不能少于 5 字节。
数据具体的内容可以参考 Nginx 的版本,在代码里有比较完整的注释。数据的 base64 是
1 | R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAICTAEAOw== |
代码注释里面 LZW 的部分一开始没看懂,看了上面那篇讲解才明白应该按小端序来读,01001100 00000001
应该提取出 100 001 101
。