可移植网络图形 (PNG) 格式的历史
PNG 的故事实际上可以追溯到 1977 年和 1978 年,当时两位以色列研究人员 Jacob Ziv 和 Abraham Lempel 首次发表了一系列关于一种新型无损数据压缩算法的论文,这些算法现在统称为“LZ77”和“LZ78”。几年后的 1983 年,Sperry 公司(后来与 Burroughs 合并成立 Unisys 公司)的 Terry Welch 开发了一种非常快速的 LZ78 变体,称为 LZW。Welch 和两位 IBM 研究人员 Victor Miller 和 Mark Wegman 也为 LZW 申请了专利。结果正如您所料,美国专利商标局 (USPTO) 授予了这两项专利(分别于 1985 年 12 月和 1989 年 3 月)。
与此同时,CompuServe 公司——特别是 Bob Berry——在 1987 年忙于设计一种新的、可移植的压缩图像格式。它的名字是 GIF,即“图形交换格式”,Berry 等人随意地选择了 LZW 作为压缩方法。CompuServe 公司(现已加入 Electric Communities 公司)的未来技术副总裁 Tim Oren 写道:“LZW 算法是从公开出版物中引入的,并且不知道 Unisys 正在申请专利。在我们发布 GIF 规范并广泛使用后,我们才注意到这项专利,这让我们非常不悦。” 有人声称(参考文献 1)Unisys 公司早在 1989 年就意识到了这一点,并选择忽略在“纯软件”中的使用;但证实这一说法的文档显然已经丢失。无论如何,多年来,Unisys 公司仅限于追逐硬件供应商——特别是调制解调器制造商在硅芯片中实现 V.42bis 的情况。
所有这一切在 1994 年底发生了变化。无论是由于持续的财务困难,还是作为 1993 年万维网提供的行业范围内的当头一棒的一部分,Unisys 公司开始积极追逐仅软件 LZW 实现的商业供应商。CompuServe 公司似乎最初是其主要目标,最终达成了一项协议——在 1994 年 12 月 28 日圣诞假期期间悄悄宣布——开始向支持 GIF 软件的作者收取版税。该消息在接下来的一周传到互联网上;当时的 comp.graphics 新闻组炸开了锅,用一个技术术语来说。正如 Usenet 的惯例,许多愤怒指向了 CompuServe 公司发布公告,然后当细节变得更清晰时,又指向了 Unisys 公司。在喧嚣声中,由 Thomas Boutell 领导的非正式互联网工作组应运而生(参考文献 2)。其目的不仅是设计 GIF 格式的替代品,而且是它的继任者:更好、更小、更可扩展且免费。
Tom 于 1995 年 1 月 4 日星期三在 comp.graphics、comp.compression 和 comp.infosystems.www.providers 上发布了第一个 PNG 草案——当时称为“PBF”,即便携式位图格式。它有一个三字节的签名,块编号而不是块名称,最大像素深度为 8 位,并且没有指定的压缩方法,但即使在那个阶段,它与今天的 PNG 的共同点也比与任何其他现有格式的共同点更多。
在一个星期内,PNG 的大多数主要功能都已被提出,即使尚未被接受:用于改进压缩的 delta 滤波(Scott Elliott);deflate 压缩(Tom Lane、Info-ZIP 团队和许多其他人);24 位支持(许多人);PNG 名称本身(Oliver Fromme);内部 CRC(我自己);gamma 块(Paul Haeberli);以及 48 位和 64 位支持(Jonathan Shekter)。第一个 proto-PNG 邮件列表也在那一周建立;Tom 发布了规范的第二个草案;我发布了一些测试结果,这些结果表明,如果仅将 GIF 的 LZW 方法替换为 deflate (LZ77) 算法,压缩率将提高 10%。侧边栏 1 是一个时间线,列出了 PNG 历史上的许多重大事件。
同样有趣的可能是最终未被接受的一些提议的功能和设计建议:Amiga IFF 格式;未压缩的位图,要么经过 gzip 压缩,要么存储在 zip 文件中;缩略图和/或通用多图像支持;小端字节顺序;用于文本的 Unicode UTF-8 字符集;YUV 和其他有损,即非无损,图像编码方案等等。其中许多主题引发了大量的讨论——事实上,zip 文件想法的主要倡导者在两年后仍在制造噪音。
PNG 小组的真正优势之一是它能够以理性的方式权衡各种问题的利弊(好吧,大多数时候是这样),达成某种共识,然后继续讨论下一个问题,而不会无限期地延长对“已结束”主题的讨论。在某种程度上,这可能是因为该小组规模相对较小,但拥有足够广泛的图形和压缩专业知识,以至于当决定不利于他时,没有人感到特别“被排斥”。所有 PNG 作者都是男性——这一事实至今仍然如此。(我确信那里有一篇论文。)但同样重要的是 Tom Boutell,作为 PNG 项目的发起者,他扮演着仁慈的独裁者的角色——很像 Linus Torvalds 对 Linux 内核开发所做的那样。当无法达成共识时,Tom 会做出决定,事情就此解决。在一两次罕见的情况下,他可能会被说服撤销决定,但这通常只发生在有新信息出现时。
无论如何,开发模型奏效了。到 1995 年 2 月初,已经产生了七个草案,PNG 格式也稳定下来。PNG 名称在草案 5 中被采用。接下来的一个月主要用于解决细节问题:块命名约定、CRC 大小和位置、过滤器类型的选择、调色板排序、透明度和 alpha 通道支持的特定风格、隔行扫描方法等。CompuServe 公司对该设计印象深刻,以至于在 2 月 7 日,他们宣布支持 PNG 作为 GIF 的指定继任者,从而取代了最初被称为 GIF24 开发项目的东西(参考文献 3)。到 3 月初,PNG 草案 9 发布,规范正式冻结——距离其诞生仅两个多月。尽管后续草案仍在继续,但它们只是增加了一些澄清、一些针对编码器和解码器的推荐行为以及一两个教程。事实上,Glenn Randers-Pehrson 保留了一些所谓的“古老 PNG”,它们是在草案 9 时创建的;今天的任何 PNG 解码器仍然可以读取它们(参考文献 4)。
但是指定一种格式是一回事;实现它完全是另一回事。尽管最初的目的是创建一个“轻量级”格式——而且,与 TIFF 甚至 JPEG 相比,PNG 确实相当轻量级——即使是完全正交的功能集也可能引入大量的复杂性。例如,考虑在 Web 浏览器中逐步显示图像。首先是对压缩数据进行直接解码——没有问题。然后必须反转任何行过滤器才能获得实际的图像数据。糟糕,这是一个隔行扫描图像:像素出现在每个 8x8 块中的此处和彼处,因此必须适当地渲染它们,并可能进行缓冲。图像还具有透明度,并且正在叠加在背景图像上,这增加了一些复杂性。在这一点上,我们并没有比使用隔行扫描的透明 GIF 差多少;行过滤器和 2D 隔行扫描方案是对程序员已经处理过的内容的非常简单的扩展。即使将 gamma 校正添加到前景图像也不是太麻烦。
但是,它不仅仅是简单的透明度;我们有一个 alpha 通道。而且我们不想要稀疏显示——我们喜欢 Netscape Navigator 使用的复制渐进方法。现在事情变得棘手了:每个复制的像素块都将一定百分比的粗前景像素与块中互补数量的背景像素混合在一起。仅仅因为当前的粗像素是 65% 透明的(或者,更糟糕的是,完全不透明的)并不意味着同一块中的后续像素也会如此;因此,我们必须记住所有原始背景像素值,直到它们的最终前景像素被合成和叠加。再加上能够在 8 位彩色映射显示器上漂亮地渲染所有这些内容的能力,大多数程序员的脑袋都会爆炸。
当然,其中一些是应用程序(演示或前端)问题,而不是通用的 PNG 解码(后端)问题。然而,一个好的 PNG 库应该允许这种应用程序的可能性——这又是另一种说法,它应该足够通用,不会对任何想要实现这些东西的程序员施加不适当的限制。
一旦草案 9 发布,许多人就开始编写 PNG 编码器和/或解码器。然而,真正的荣耀实际上是为三个人保留的:Info-ZIP 的 Jean-loup Gailly 和 Mark Adler(两人都因 gzip 而闻名),他们最初编写了 Zip 的 deflate() 和 UnZip 的 inflate() 例程,然后,为了 PNG,将它们重写为一个名为 zlib 的可移植库(参考文献 5),以及 Group 42 的 Guy Eric Schalnat,他几乎单枪匹马地从头开始编写了 libpng 参考实现(最初为“pnglib”)([参考文献 6)。库的第一个真正可用的版本在草案 9 发布两个月后,于 1995 年 5 月 1 日发布。尽管这两个库都缺少完全实现所需的一些功能,但它们已经足够完整,可以在各种免费软件应用程序中使用。规范的草案 10 与此同时发布,其中包含从这些首次实现中获得的澄清。
随后的发展步伐在那时放缓了。部分原因是,经过四个月的紧张开发和每天数十封电子邮件之后,每个人都筋疲力尽;部分原因是 Guy 控制了 libpng 的开发,并开始忙于工作中的其他事情;还有部分原因是人们认为 PNG 基本上“完成了”。CompuServe 公司在 6 月中旬发布的新闻稿强调了后一点。我可能会补充说,在新闻稿中,他们的公关人员声称 PNG 的开发功劳很大一部分归功于他们(叹气)。
尽管如此,进展仍在继续。1995 年 6 月,我建立了 PNG 首页,现在已扩展到大约十几页(参考文献 7),Kevin Mitchell 向 Apple Computer 正式注册了“PNGf”Macintosh 文件 ID。8 月,Alexander Lehmann 和 Willem van Schaik 发布了 NetPBM 图像处理套件的两个精良的附加组件,在 Linux 下尤其方便:pnmtopng 和 pngtopnm 版本 2.0。12 月,在第四届国际万维网会议上,万维网联盟 (W3C) 发布了 PNG 规范版本 0.92,作为官方标准跟踪工作草案。
1996 年,互联网工程任务组 (IETF) 在 2 月发布了版本 0.95 作为互联网草案,随后互联网工程指导小组 (IESG) 在 7 月批准了版本 1.0 作为官方信息性 RFC。然而,在撰写本文时,六个月后,IETF 秘书处仍未发布实际的 RFC 编号(叹气)。虚拟现实建模语言 (VRML) 架构组在 8 月初采用 PNG 作为 VRML 2.0 最低限度一致性的两种必需图像格式之一(参考文献 8)。与此同时,W3C 在 7 月将规范提升为建议推荐状态,然后在 10 月 1 日提升为完全推荐状态(参考文献 9)。最后,在 10 月中旬,互联网号码分配机构 (IANA) 正式批准“image/png”作为官方互联网媒体类型,与 image/gif 和 image/jpeg 一起成为 Web 的非实验性图像格式。如果没有 Tom Lane 和 Glenn Randers-Pehrson 的不懈努力,许多标准化工作就不会如此迅速地完成,他们从 Thomas Boutell 手中接过了规范的编辑职责。
那么我们今天在哪里呢?PNG 的未来绝对光明,现在的情况也还不错。我现在列出了超过 125 个应用程序(参考文献 10),这些应用程序当前或计划支持 PNG(主要是当前支持)。其中可用于 Linux 的有
XV: 图像查看器/转换器
ImageMagick: 图像查看器/转换器
GRAV: 图像查看器
Zgv: 图像查看器
xli: 图像查看器
XPaint: 图像编辑器
The GIMP: 图像编辑器
Image Alchemy: 图像转换器
pnmtopng/pngtopnm: 图像转换器
XEmacs: 编辑器/网页浏览器/操作系统/等等
gforge: fractal 地形生成器
Fractint: fractal 生成器
Ghostscript: PostScript 查看器/转换器
GNUplot: 绘图程序
PV-WAVE: 科学可视化程序
POV-Ray: 光线追踪器
VRweb: VRML 浏览器
X Mosaic: 网页浏览器
Arena: 网页浏览器
Chimera: 网页浏览器
Grail: 网页浏览器
Amaya: 网页浏览器/编辑器
Mapedit: 图像地图编辑器
WWWis: HTML IMG 大小调整器
file(1): Unix 文件类型标识符
有眼光的读者会注意到 Netscape Navigator 的明显缺席。尽管有以下事实,Netscape 仍然只是“考虑”未来对 PNG 的支持
Netscape 从一开始就意识到了 PNG 项目,并非正式地表示“可能支持”。
gamma 校正、alpha 支持和 2D 隔行扫描为 WWW 应用程序带来的好处。
万维网联盟(Netscape 是其成员之一)发布了 PNG 规范,作为其第一个官方建议。
VRML 2.0 查看器(如 Netscape 自己的 Live3D 插件)中需要支持 PNG。
Netscape 已经受到了 PNG 小组和整个互联网社区成员的相当大的纠缠。
在 Netscape 要么原生支持 PNG,要么被微软或其他公司收购之前,PNG 作为 Web 图像格式的实用性大大降低。
另一方面,我们在微软的朋友们认识到了 PNG 的好处,并且显然全心全意地接受了它。他们不仅将其作为 Office97 应用程序套件的本机图像格式,而且还多次承诺将其放入 Internet Explorer 中。(理论上在 4.0 beta 版发布时——我们将拭目以待是否会发生这种情况。)假设他们这样做,Netscape 几乎肯定会效仿。(看到了吗?微软确实有些用处!)到那时,PNG 应该会真正爆发 WWW 兴趣和使用量。
与此同时,使用 Linux Netscape 实际上可以查看 PNG;只是不是很实用。Rasca Gmelch 正在开发一个具有(除其他外)PNG 支持的 Unix 插件。虽然它仍然是 alpha 版本,并且需要 ImageMagick 的 convert 实用程序才能运行,但这并不是问题,Netscape 脑残的插件架构才是问题。插件对 HTML 的 IMG 标签没有影响:如果没有对图像格式的本机支持,也没有定义助手应用程序,则无论已安装的插件是否支持该图像格式,该图像都会被忽略。相反,您必须使用 Netscape 的 EMBED 扩展。这意味着任何想要通用可查看网页的人都会两败俱伤:PNG 与 IMG 在 Netscape 下不起作用,PNG 与 EMBED 在除了 Netscape 和 MSIE 之外的任何东西下都无法正常工作,而且只有在用户安装了可用的 PNG 插件的情况下才能正常工作。
然而,其他五六个 Linux 网页浏览器的支持也不错,甚至像 Adobe Photoshop 这样的主流应用程序现在也原生支持 PNG。每周都有更多出现。生活真美好。
随着 VRML 的兴起——这几乎肯定会发生,尤其是随着真正廉价、高性能 3D 加速器的出现——PNG 将随之而来。JPEG 是另一种必需的 VRML 2.0 图像格式,但它不支持透明度。图形艺术家将使用 PNG 作为中间格式,因为它具有无损 24 位(及以上)压缩,并作为最终格式,因为它能够存储 gamma 和色度信息以实现平台独立性。一旦“大牌”浏览器原生支持 PNG,用户也将采用它——为了 2D 隔行扫描方法、跨平台 gamma 校正以及制作在任何颜色背景下看起来都不错的抗锯齿球、按钮、文本和其他图形元素的能力。由于 alpha 通道支持,不再有“重影”。
事实上,唯一悬而未决的问题是对动画和其他多图像应用程序的支持。回想起来,PNG 小组的主要失败之处在于延迟将 PNG 扩展到 MNG,即“多图像网络图形”格式。如前所述,到 1995 年 5 月,每个人都非常疲惫;事实上,整整一年之后,对 MNG 的认真讨论才重新开始。不幸的是,1995 年 10 月是第一个带有动画支持的 Netscape 2.0 beta 版发布的时间,这使得(垂死的?)GIF 格式重新流行起来。
在撰写本文时(1997 年 1 月中旬),MNG 规范已经经历了大约 31 个草案——几乎完全由 Glenn Randers-Pehrson 撰写——并且即将冻结,尽管最近出现了一波新的活动。也编写了一些特殊用途的 MNG 实现。但是 MNG 对于 VRML 2.0 规范来说太晚了,尽管它有一些非常引人注目的功能,但它可能永远不会被认为不仅仅是 PNG 对 GIF 动画的回应。时间会证明一切。
对于内部人士来说,判断像 PNG 这样的项目总是很困难的;旧的见树不见林的问题往往会妨碍客观性。但在我看来,PNG 的故事,就像 Linux 的故事一样,代表了互联网的精华:国际合作、快速开发以及“好东西”的生产,这种“好东西”不仅有用,而且对每个人都是免费提供的。
我要感谢 Jean-loup Gailly 撰写的优秀 comp.compression FAQ,这是上面给出的许多专利信息的来源(参考文献 11)。还要感谢 Mark Adler 和喷气推进实验室 (JPL),他们一直是 PNG 首页、zlib 首页、Info-ZIP 首页和我个人首页的出色且慷慨的主机。并非 Mark 的过错,这一切在新的一年结束了;奇怪的是,JPL 认为这一切都与行星研究没有特别的关联。真是不可思议。
