一枚 9×9 像素的 favicon 能装下多少内容?答案是:一整个网页。
开发者 Tim Wehrle 尝试了一种隐写术(steganography)技巧,把一段 HTML 代码直接编码进 favicon 图片的像素里。核心思路很简单:每个像素有 R、G、B 三个颜色通道,每个通道就是一个字节。图片文件本质上就是字节序列,字节序列本质上就是数据。
工作原理
他把要「装进去」的网页内容用 TextEncoder 转成 UTF-8 字节流,在开头加上 4 个字节的长度头,方便解码时知道有效载荷到哪里结束。然后按顺序把字节填进 RGB 通道:第一字节→红色,第二字节→绿色,第三字节→蓝色,再进入下一个像素……填完最后一个字节时,一整段 HTML 就变成了一张彩色噪点图。
由于只用了 208 字节的网页内容,加 4 字节头共 212 字节,每个像素存 3 字节,最小的正方形需要至少 71 像素——也就是 9×9(81 像素),最终容量利用率约 87%。生成的图片肉眼看去就是无意义的噪点。
读取与局限
读取过程是编码的逆操作:浏览器加载 favicon 绘制到 canvas 上,用 JavaScript 读取每个像素的 RGB 值,重建字节流,读取前四字节得到长度,再取出剩余的 HTML 内容并渲染页面。也就是说,没有这段引导脚本,favicon 就只是一张「装着网页内容的 PNG」。
作者自己也承认:这没什么实用价值。数据量极小、依赖 JavaScript 解码、传播方式也不比直接放网页方便。但他觉得乐趣正在于此——favicon 本该是个「小小的图标」,但它本质上就是 PNG,而 PNG 就是字节,字节就是存储空间。「测试边界本身就是意义所在。」
编注:信源为 Tim Wehrle 个人博客实验室板块,材料详细记录了技术实现细节与思路,作者本人提供了 Demo 与 GitHub 仓库链接。