文档 PNG (.png)
W3C 标准便携式网络图形(Portable Network Graphics,PNG)是一种无专利限制的光栅图形文件格式,支持无损数据压缩、索引颜色和可变 Alpha 通道透明度。
将 PNG 转换为 JPG
免费的浏览器端 PNG 转 JPG 转换器。在您的设备上即时转换文件。
在线压缩 PNG
隐私保护 - 文件不会离开您的设备
检查与元数据
操作系统和文件分析器通过检查开头的二进制字节序列来识别 PNG 文件:
字节级文件头签名 (魔数)
操作系统和文件分析器通过检查开头的二进制字节序列来识别 PNG 文件:
十六进制签名 (偏移量 0):
89 50 4E 47 0D 0A 1A 0AASCII 表示形式: .PNG....
标准化: W3C 推荐标准 (1996) / ISO/IEC 15948:2004
技术规格
| 容器架构 | 基于数据块(chunk)的二进制容器,每个数据块带有 4 字节的 CRC32 校验 |
| 压缩方式 | Deflate(LZ77 + 哈夫曼编码),采用 5 种预测扫描行过滤器(None、Sub、Up、Average、Paeth) |
| 字节序 | 大端序(网络字节序),用于数据块长度、尺寸和 CRC |
| 色彩空间 | sRGB, Display P3, 索引调色板 (1-8 位), 灰度, 真彩色 (24/48 位) |
| 通道与结构 | RGB + Alpha(每个通道最高 16 位 / 64 位 RGBA) |
| 最大尺寸 | 2,147,483,647 x 2,147,483,647 像素(4 字节无符号整数) |
| 透明度 | 完整的 8 位 / 16 位可变 Alpha 透明通道 |
| 流式传输与渐进式加载 | Adam7 7 遍交错算法支持渐进式二维扫描行渲染。 |
技术对比矩阵:PNG 对比同类产品
| 技术属性 | PNG (当前) | WebP | AVIF | JPEG |
|---|---|---|---|---|
| 压缩类型 | 严格无损(Deflate + 二维预测过滤器) | 有损(VP8)与无损(VP8L) | 有损(AV1 intra)与无损 | 严格有损(离散余弦变换) |
| Alpha 透明度 | 完整的 8 位 / 16 位可变 Alpha 通道 | 支持 8 位 Alpha 通道 | 支持 8 位 / 10 位 / 12 位 Alpha | 不支持透明通道 |
| 文件大小(照片) | 较大(通常为有损格式的 3 到 6 倍) | 小(比 JPEG 小 25%-35%) | 超小(比 JPEG 小 40%-55%) | 中等基准 |
| 文件大小(图形/UI) | 截图、线稿和文本的文件体积极小 | 极佳的无损模式 | 良好,但编码较慢 | 较差(沿尖锐边缘产生振铃伪影) |
| 浏览器兼容性 | 自 1998 年以来在所有浏览器中 100% 通用 | 支持 97% 以上的现代浏览器 | 93%+ 现代浏览器支持 | 100% 通用 |
常见损坏模式与十六进制恢复指南
图像查看器显示"致命错误:不是有效的 PNG 文件"或无法打开。
根本原因: 前 8 个字节被 ASCII 传输模式修改(将 0x0D 0x0A 错误转换为 0x0A 或 0x0D 0x0D 0x0A)。
恢复方法: 在十六进制编辑器中打开文件,并验证前 8 个字节是否与"89 50 4E 47 0D 0A 1A 0A"匹配。恢复这 8 个准确的头部字节通常可以修复图像。
pngcheck 报告"IDAT 数据块中出现 CRC 错误"或图像部分加载,底部扫描行损坏。
根本原因: 压缩的 zlib 数据流中的位损坏,或者 IDAT 数据块中的 CRC32 校验和无效。
恢复方法: 使用 pngcheck -f 或 Deflate 流恢复实用程序重新计算有效的 CRC32 值,或者解压损坏块之前仍完好的扫描线。
图像在桌面查看器中渲染正常,但在 iOS 应用程序中失败。
根本原因: iOS 要求使用苹果专有的 CgBI 字节交换格式,或图像包含非标准色彩空间数据块。
恢复方法: 使用“pngcrush -revert-iphone-optimizations”将图像标准化,以恢复标准的 W3C RGBA 顺序。
安全分析与解析器攻击向量
PNG 受到许多操作系统和应用的支持。安全风险包括耗尽解码器内存的攻击和恶意辅助数据块。
已知攻击向量
- 过大的 tEXt 和 zTXt 元数据块在未沙盒化的解码器中触发内存耗尽(OOM)拒绝服务。
- 传统 libpng 版本中的堆缓冲区溢出漏洞(例如 png_set_PLTE 中的 CVE-2015-8126)。
- 像素泛洪解压攻击,即文件体积很小的图像声明了巨大的尺寸(例如 100,000 x 100,000 像素)。
- 通过隐写术窃取数据,将加密载荷隐藏在辅助私有数据块中(例如 eXIf 或自定义数据块类型)。
防御性最佳实践: 在内存中分配像素缓冲区之前,务必验证图像尺寸。使用内存安全的净化器在用户上传时剥离非必要的辅助数据块(eXIf、tEXt)。
历史渊源与里程碑
核心优势与特点
- PNG 使用无损压缩,因此对未更改的图像进行编码不会产生压缩损失;但编辑或颜色转换仍可能改变像素值。
- 平滑的 8 位 Alpha 透明度可在复杂背景上实现自然融合。
- 伽马校正和色度数据块确保跨不同显示器的一致渲染。
技术局限与劣势
- 对于摄影内容,与 WebP 或 AVIF 等现代有损格式相比,文件体积明显更大。
- 标准 PNG 中没有原生的多帧动画(需要 APNG 扩展)。
- 高位深(每通道 16 位)会产生巨大的未压缩内存解码缓冲区。
趣味技术冷知识
- 8 字节魔数头部专为检测 FTP 传输造成的 CR/LF 换行符损坏而设计。
- PNG 非官方的递归缩写是"PNG's Not GIF"。
- 苹果在 iOS 应用 PNG 中使用了专有的 CgBI 数据块,将 RGBA 反转为 BGRA 以进行直接 GPU 渲染。
常见技术问题
为什么 PNG 文件在图像编辑器中保存时有时会变大?
不同的软件套件使用不同的 Deflate 压缩级别和预测扫描线过滤策略。诸如 Photoshop 之类的程序经常附加未压缩的色彩空间配置文件、XMP 元数据块以及未优化的 IDAT 数据块大小。诸如 File2File.app 压缩器之类的专用工具会重新评估所有 5 种扫描行过滤器,以实现最小的文件大小。
PNG-8 和 PNG-24 之间有什么区别?
PNG-8 使用最多 256 种颜色的索引调色板(类似于 GIF),生成非常小的文件,适合简单的图标。PNG-24 支持 1670 万种颜色(真彩色,每通道 8 位),而 PNG-32 则添加了一个 8 位的 Alpha 透明通道。
为什么 PNG 有 5 种预测扫描行过滤器?
Deflate 压缩重复的字节模式。由于摄影或渐变像素值会逐渐变化,PNG 通过计算相邻像素之间的差值来过滤每条扫描线(None、Sub、Up、Average、Paeth)。这会将渐变数据转换为接近零的字节串,从而在 Deflate 下实现极大程度的压缩。
PNG 是否支持用于商业印刷的 CMYK 色彩空间?
不支持。官方 W3C PNG 规范刻意将色彩类型限制为灰度、索引和 RGB。需要 CMYK 的专业印刷工作流程必须使用 TIFF 或 PDF 容器。
相关的 PNG 转换对
通过应用有损压缩将 PNG 光栅图像转换为 JPEG 格式可减小文件大小,从而使图像在网站上加载更快并占用更少的存储空间。
将有损的 JPEG 光栅图像转换为无损的 PNG 光栅图像,可避免进一步的代际损失,并支持 Alpha 通道透明度。
将 PNG 图像转换为 WebP 可以减小文件体积并保留透明度;实际结果取决于采用有损还是无损编码,以及图像内容。
将 WebP 转换为 PNG,可为支持 PNG 的软件生成静态图像;转换不会保留 WebP 动画,也无法恢复有损源图像中已丢失的细节。
将 HEIC 转换为 PNG,将有损 HEVC 压缩照片转换为受广泛支持的无损图形文件。
将 SVG 矢量文件转换为 PNG 光栅图像,把基于代码的可缩放图形转化为固定像素网格,以实现广泛的应用兼容性。
将光栅 PNG 图像封装在 SVG XML 矢量容器中,以便实现响应式网页缩放,并集成到支持矢量图的布局中。
直接在浏览器中将 Adobe Photoshop PSD 图形转换为带完整 Alpha 通道透明度的无损 PNG 图像,无需服务器传输。