一名开发者创建了一种自定义编码方案,能够仅用 76 位(或在 Base94 格式中约 9 个字符)来表示平均国旗。通过将国旗视为一系列分层几何组件(如条纹、星星和新月)的处理方式,该系统允许生成高度压缩的数据,并可重构为可识别的 SVG 图形。

此视觉效果展示了解码和渲染过程的最终输出。
几何分层模型
该编码将国旗视为不同视觉元素的组合,而非静态图像。它定义了一种协议,其中国旗由各层构建,类似于 Photoshop 等软件处理对象的方式。例如,美国国旗的构建是先定义条纹层,接着是蓝色矩形区域,最后是星星形状层。
由 HN Digest 根据 vantezzen.io 报告的数据绘制;数值按源文件显示。
常见元素被归类为特定类型:条纹(水平、垂直或倾斜)、形状(星星、新月、圆形)和区域(矩形或带状)。特殊组件(如 Union Jack)被视为“内置”形状,以简化澳大利亚或新西兰等国旗的构建。
“平均国旗可以用 76 位表示,中位数为 55 位。”
— Compressing a flag to 11 bits · vantezzen
Huffman 编码与位打包
为了实现高压缩率,系统采用 Huffman 树,根据国旗特征的频率分配二进制代码。由于 45% 的国旗共享 2:3 的宽高比,系统为这一常见特征分配单个比特(0)。同样,最频繁的颜色——红色、白色和蓝色——在定义的调色板中被赋予短位序列。

这张图片展示了将几何国旗组件转换为位打包格式的过程。
该格式通过在 Huffman 树中使用“自定义”(Custom)叶子节点来处理独特国旗的“长尾”分布。如果一个国旗具有罕见属性(例如萨尔瓦多的 189:335 宽高比),系统将切换到固定长度的自由值选项。这使得编码在保持常见国旗紧凑的同时,仍能支持离群值。
权衡与局限性
这种几何方法的首要权衡是纹章精度的损失。该系统有意忽略精确的颜色色调和复杂的细节,转而追求“可识别”的准确性。虽然这适用于印尼等简单设计,但在处理包含复杂纹章、印章或动物符号的国旗时表现不佳。
目前,仍有 67 种国旗无法编码,因为它们包含几何模型无法表达的元素,例如阿富汗的 Y 形或西班牙和墨西哥等国家的复杂徽章。虽然简单的 8 位查找表可以更准确地表示这些国旗,但它将缺乏基于 Huffman 的位打包方法所具备的生成灵活性和节省比特的潜力。
Hacker News 读者的反应
- 替代方案: 一位评论者建议,简单的 8 位查找表优于 11 位编码,因为它能更有效地处理复杂的纹章和几乎相同的国旗。 评论 ↗
- 质疑: 一位评论者对该方案的成功表示怀疑,指出它未能编码全球约 35% 的国旗,其中包括几个拥有简单国旗的国家。 评论 ↗
- 技术补充: 另一位用户提出了不同的技术方法,涉及颜色量化和求解最小测试集问题,以找到区分每种国旗的最小像素位置子集。 评论 ↗
- 质疑: 一位读者质疑该编码的有效性,认为既然目标是绘制国旗而非存储唯一项列表,那么 8 位 ID 系统就足够了。 评论 ↗
以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗