1 历史背景

1.1 诞生动机:GIF的专利危机

20世纪90年代,GIF(Graphics Interchange Format)是互联网上主流的图像格式,其采用LZW压缩算法并支持动画和透明色。然而,Unisys公司和IBM公司持有LZW算法的专利,并于1994年宣布对GIF的使用征收专利许可费。这一“专利陷阱”引发了互联网社区的强烈反弹,开发者们迫切需要一种免费、开放、无专利限制的图像格式。PNG正是在这种“让GIF见鬼去”的集体情绪中诞生的,其名称最初被戏称为“PNG's Not GIF”(PNG不是GIF),以宣示其版权立场。

1.2 标准化进程:W3C与IETF协作

1995年1月,一个由Thomas Boutell领导的线上讨论组开始设计新格式,并于同年10月发布了PNG 0.5草案。随后,万维网联盟(W3C)与互联网工程任务组(IETF)联手推进标准化。1996年10月1日,W3C正式推荐PNG 1.0作为互联网标准(RFC 2083)。IETF随后在1997年3月发布了RFC 2083的修订版。这一协作确保了PNG既满足Web图像需求,又具备严谨的二进制规范。

1.3 版本演进:从PNG 1.0到PNG 1.2

PNG 1.0定义了核心功能:无损压缩、真彩色/灰度/索引色支持、Alpha透明通道。1998年发布的PNG 1.1增加了部分改进,如sRGB色块。2000年发布的PNG 1.2进一步修订了小错误,并引入了一些可选块(如背景色建议块bKGD)。此后,PNG规范基本稳定,没有重大版本更新——因为开发者们的精力已转向动画扩展(APNG)和下一代格式的竞争。PNG 1.2至今仍是实际应用中的标准版本。

2 技术原理

2.1 无损压缩机制

PNG的无损压缩采用两步走策略:首先对像素数据进行“过滤”,使数据更适于压缩;然后对过滤后的结果应用Deflate算法。整个过程不丢弃任何图像信息,解压后与原始数据完全一致

2.1.1 过滤方法(Filtering

过滤是在逐行扫描的基础上,对每个像素的字节值进行可逆变换,以降低相邻像素间的冗余。PNG定义了五种过滤模式:None、Sub、Up、Average和Paeth,每个图像行可以独立选择一种模式。

2.1.1.1 Sub、Up、Average、Paeth算法对比
  • Sub:将当前像素值减去其左边像素的值(同一行)。适用于水平渐变明显的图像。
  • Up:将当前像素值减去其正上方像素的值(上一行)。适用于垂直渐变明显的图像。
  • Average:将当前像素值减去左边和上方像素值的平均值。兼顾水平和垂直方向,适用于纹理复杂的区域。
  • Paeth:使用Paeth预测器,根据左边、上方和左上方像素的线性函数预测当前像素,然后减去预测值。该算法对边缘和渐变更敏感,通常提供最佳的压缩效率。实际编码时,压缩器会尝试所有五种模式,并选择能产生最小数据量的模式。

2.1.2 Deflate压缩算法

Deflate是Philip Katz开发的压缩算法,结合了LZ77(基于字典的重复字符串替换)和哈夫曼编码(对符号出现频率进行变长编码)。PNG使用标准的Deflate实现(zlib库),将过滤后的数据流压缩为一连串的压缩块。Deflate的压缩等级(1-9)可在编码时调节,等级越高压缩率越大,但耗时也越长。由于PNG是无损的,Deflate不能有任何信息丢失,因此压缩比受限于图像本身的冗余程度。

2.2 图像数据组织

2.2.1 像素深度与色彩类型

PNG支持1、2、4、8、16位像素深度,但实际常见的深度为8位(每通道)和16位(高精度)。色彩类型由IHDR块中的颜色类型(Color Type)字段定义,共五种:

  • 灰度(0):单通道。
  • 灰度+Alpha(4):两通道。
  • 真彩色(2):RGB三通道。
  • 真彩色+Alpha(6):RGBA四通道。
  • 索引色(3):使用调色板(PLTE块),最多256种颜色。

2.2.2 透明通道(Alpha通道)

Alpha通道表示像素的不透明度,取值范围与像素深度一致(如8位下0~255)。0表示完全透明,255表示完全不透明。PNG的Alpha通道支持全精度、半透明和渐变透明度,这使得它成为Web设计中制作遮罩、图标和Logo的首选——毕竟,一个带透明背景的PNG表情包永远不会让背景里的狗头穿帮。

2.3 关键块结构

PNG文件由一系列“块”(Chunk)串联而成,每个块包含长度、类型、数据和CRC校验

2.3.1 必须块:IHDR、IDAT、IEND

  • IHDR(图像头):位于文件开头,固定13字节,定义图像宽度、高度、位深度、颜色类型、压缩方法、过滤方法和交错标志。没有它,解码器连图片是矩形还是三角形都搞不清。
  • IDAT(图像数据):存储压缩后的像素数据。一个PNG文件可包含多个连续的IDAT块,解码器需将它们拼接后解压。通常压缩工具会输出单个IDAT块以提高效率。
  • IEND(图像结束):空数据块,标记文件结束。它的存在就像一根“到此为止”的终点线,防止解码器继续读取垃圾数据。

2.3.2 可选块:PLTE、tEXt、tRNS等

  • PLTE(调色板):用于索引色图像,最多包含256个RGB颜色条目。
  • tRNS(透明色):为索引色或真彩色图像定义单一透明颜色(即所谓的“透明色”,而非Alpha通道)。在GIF时代这曾是透明的主要方式,PNG中它仍作为兼容性选项保留
  • 其他常用可选块:如bKGD(背景色)、gAMA(伽马校正)、cHRM(色度学)、sBIT(有效位深度)、sRGB(标准RGB色域)、iCCP(ICC色彩配置)等。

3 文件结构与元数据

3.1 文件签名(8字节魔数)

PNG文件的前8个字节是固定的文件签名(Magic Number),十六进制值为:89 50 4E 47 0D 0A 1A 0A。其中89用于检测非文本传输系统中的潜在问题,后面依次是PNG的ASCII码(PNG)以及DOS/Windows和Unix的行尾标记。任何不以这8个字节开头的文件都不是合法PNG,浏览器和图像查看器据此迅速拒绝那些“伪PNG”。

3.2 数据块(Chunk)格式

每个数据块由四部分组成:

  1. 长度(4字节,大端序):表示数据区的字节数。
  2. 类型(4字节,ASCII字母):如IHDR、IDAT等。类型名的大小写具有意义:首字母大写表示“临界块”(必须理解),小写表示“辅助块”(可忽略)。
  3. 数据(长度可变):块的具体内容。
  4. CRC校验(4字节):计算类型和数据区的32位循环冗余校验码,用于检测传输或存储过程中的损坏。

这种设计使得解码器可以按顺序读取块,忽略不认识的辅助块,从而保证向前兼容。

3.3 常用元数据类型

3.3.1 文本数据(tEXt、zTXt、iTXt)

  • tEXt:存储键值对文本(如“Author”:“John Doe”),不压缩。适用于简短注释
  • zTXt:与tEXt类似,但文本数据使用Deflate压缩,节省空间。
  • iTXt:国际文本,支持UTF-8编码、语言标签和可选的压缩,常用于多语言描述。

这些文本块让PNG文件可以携带作者、版权、描述等信息,虽然大多数用户并不会去翻阅——除非他们在查找“这张图的生成器是啥”的元数据。

3.3.2 时间戳(tIME)

tIME块记录图像最后修改的时间,格式为年-月-日-时-分-秒UTC)。它不用于自动更新缓存,更多是给归档管理用。

3.3.3 物理像素尺寸(pHYs)

pHYs块指定图像的实际显示尺寸(每米的像素数,或像素纵横比)。例如,一张96 DPI的屏幕截图的pHYs值可设为2835/米(96×39.37),确保在不同设备上保持正确的物理尺寸——尽管大多数浏览器懒得理它,直接用CSS缩放。

4 应用与兼容性

4.1 网页图像的首选格式

PNG凭借无损压缩和Alpha透明通道,成为网页图标、Logo、UI元素、截图、示意图等需要清晰边缘或透明背景的场景的首选。根据HTTP Archive的统计,截至2023年,仍有约40%的Web图像采用PNG格式,位居第二(仅次于JPEG)。其“万金油”地位甚至催生了调侃:“如果一个设计师说‘帮我导出一张图’,90%的情况下他要的是PNG。”

4.2 与JPEG、GIF、WebP的对比

4.2.1 压缩效率:PNG vs JPEG

JPEG采用有损压缩,通过丢弃人眼不敏感的高频细节实现极高的压缩比(通常可达到1:10至1:20)。对于照片等连续色调图像,JPEG在同等文件大小下视觉质量远优于PNG。而PNG无损压缩的典型压缩比仅为1:2至1:5,对于纯色区域多、细节少的图像(如卡通、界面截图)反而优于JPEG。简而言之:JPEG适合照片,PNG适合“高对比度且不接受画质损失”的情况。

4.2.2 动画支持:PNG vs GIF vs APNG

传统PNG不支持动画,而GIF支持。为弥补这一短板,Mozilla开发了APNG(动画PNG),它在PNG基础上将每一帧作为单独的IDAT块序列存储,兼容性良好(现代浏览器均支持)。GIF则只有256色且不支持半透明。APNG可以同时拥有真彩色、透明度和动画,因此逐渐取代GIF成为表情包界的“新王”——然而,由于老旧的iOS Safari曾长期不支持APNG,“一张动图在朋友圈转成静态”的悲剧仍时有发生。

4.3 软件支持与优化工具

4.3.1 常用编辑器(Photoshop、GIMP、Figma)

  • Adobe Photoshop:支持完整的PNG读写,提供“存储为Web所用格式”对话框,可调节PNG-8(索引色)和PNG-24(真彩色),并保留透明度。
  • GIMP:开源免费,保存PNG时可选择压缩等级、透明保留和元数据。
  • Figma:在线UI设计工具,导出PNG时支持单项元素透明导出,是设计师的日常“又要导PNG”的罪魁祸首之一。

4.3.2 压缩工具(pngcrush、pngquant、OptiPNG)

  • pngcrush:经典命令行工具,通过尝试不同的过滤方法和Deflate参数寻找最佳压缩方案。
  • pngquant:将真彩色PNG转换为8位索引色(PNG-8)并应用抖动,在几乎不造成视觉差异的情况下将文件大小减少50%~70%。适合Web图标和表情包。
  • OptiPNG:基于pngcrush的改进版本,压缩效率更高,常被集成到自动化构建流程中。它的语速优雅,但抱怨“这图还能再小吗?”的用户依然不会满意。

5 衍生与扩展

5.1 APNG(动画PNG)

APNG是PNG的官方扩展(由Mozilla提出,后来被W3C采纳为规范)。它在PNG文件末尾添加额外的帧数据(fdAT块),第一帧由原始IDAT块提供,后续帧由fcTL(帧控制)和fdAT组成。APNG支持无限循环和透明度,兼容不支持APNG的解码器(它们会显示第一帧作为静态PNG)。如今,APNG已成为表情包和游戏UI动画的主流格式,甚至有段子说:“你永远不知道一个APNG里藏了多少帧的‘啊哈哈哈’”。

5.2 MNG(多图像网络图形)

MNG(Multiple-image Network Graphics)是PNG的动画版本,早于APNG。它支持复杂的多图像序列、真彩色动画、JPEG压缩帧等更高级的功能,但由于复杂度高、软件支持差,最终被APNG取代。MNG就像一个过于早熟的“高智商少年”,在PNG被广泛使用之前就已默默退场,只留下一些技术文档供考古。

5.3 PNG在游戏与软件资源中的“梗”文化

5.3.1 “啊?又要导出PNG?”——设计师的日常

在UI设计、游戏美术等工作中,设计师需要频繁导出各种资源(图标、按钮、背景等)为PNG格式。随着项目迭代,每一次修改都意味着重新导出、覆盖、替换。于是,办公室内常回响着“啊?又要导PNG?”的哀嚎。这句话已成为设计师与程序员之间“爱与恨”的象征——前者追求像素级完美,后者追求“别让我手动替换文件路径”。

5.3.2 透明背景表情包的宇宙霸主地位

PNG的透明支持使其成为表情包文化的核心。从“黑人抬棺材”到“熊猫头”,几乎所有流行表情包都以PNG格式传播。透明背景允许用户将表情包自由叠加到任何聊天截图、视频或图片上,从而衍生出“戴着墨镜的狗”、“跑路的香蕉”等经典模因。PNG因此被戏称为“互联网梗文化的原子弹”——它让每个人都能在聊天中随心所欲地“P图”,而不用操心背景颜色冲突。

6 未来展望

6.1 下一代格式(AVIF、JPEG XL)的挑战

近年兴起的新一代图像格式AVIF和JPEG XL均支持无损和有损压缩,且压缩效率远超PNG(尤其在照片类图像上)。AVIF基于AV1视频编码,JPEG XL则兼容JPEG并支持超高动态范围。它们在Web端的普及正在蚕食PNG在无损场景下的份额——例如Chrome已默认支持AVIF无损。但PNG凭借其简单、开放、软件支持广泛的优势,短时间内难以被完全替代。在“透明背景+无损”这个赛道上,PNG仍是老牌王者。

6.2 PNG在无损存储领域的不可替代性

尽管新格式声称“比PNG小20%”,但PNG的Deflate算法经过二十余年的优化已接近无损压缩的理论极限,且所有操作系统、图像库和浏览器原生支持。它没有专利问题(GIF的教训历历在目),元数据块结构简单,易于编程处理。对于需要长期存档、跨平台共享、且对文件大小不敏感的文档扫描、医学影像、历史资料等场景,PNG仍是首选。更重要的是,人类已经习惯了“透明背景=PNG”的思维定式——当有人问“这张图背景怎么是花的?”时,答案永远是:“你存成PNG了吗?”