PNG图像文件结构

PNG(Portable Network Graphics,便携式网络图形)是一种无损压缩的位图图像格式,广泛用于网络和图形应用。PNG 文件具有清晰的结构,由一系列**数据块(Chunks)**组成,这些数据块按照特定顺序排列,并以固定的文件签名开头。


一、PNG 文件整体结构

PNG 文件的基本结构如下:

复制代码
[8-byte signature]
[Chunk 1]
[Chunk 2]
...
[Chunk N]

1. 文件签名(File Signature)

  • 固定为 8 字节:89 50 4E 47 0D 0A 1A 0A
  • 作用:标识这是一个 PNG 文件,防止与其他格式混淆。

二、数据块(Chunk)结构

每个 Chunk 由四个部分组成:

字段 长度(字节) 说明
Length 4 数据字段的长度(不包括本字段、Chunk Type、CRC)
Chunk Type 4 块类型(ASCII 字符,如 "IHDR"、"IDAT" 等)
Chunk Data 可变 实际数据内容
CRC 4 循环冗余校验码(对 Chunk Type + Chunk Data 计算)

所有多字节整数均采用 大端序(Big-endian) 存储。


三、关键数据块(Critical Chunks)

必须出现在每个 PNG 文件中,且顺序固定:

1. IHDR(Image Header)

  • 位置:第一个块(紧跟签名之后)
  • 长度:13 字节
  • 内容
    • Width(4 字节):图像宽度
    • Height(4 字节):图像高度
    • Bit depth(1 字节):颜色深度(如 1, 2, 4, 8, 16)
    • Color type(1 字节):颜色类型(0=灰度, 2=真彩色, 3=索引色, 4=灰度+Alpha, 6=真彩色+Alpha)
    • Compression method(1 字节):压缩方法(目前只支持 0:deflate/inflate)
    • Filter method(1 字节):滤波方法(目前只支持 0)
    • Interlace method(1 字节):隔行扫描方式(0=非隔行, 1=Adam7 隔行)

2. PLTE(Palette,可选)

  • 仅当 Color Type = 3(索引色)时必需
  • 包含 RGB 调色板条目(每项 3 字节)

3. IDAT(Image Data)

  • 一个或多个 IDAT 块(必须连续出现)
  • 存储经过滤波和 deflate 压缩后的像素数据
  • 所有 IDAT 块的数据拼接后解压得到原始扫描行数据

4. IEND(Image End)

  • 最后一个块
  • 长度为 0,标志 PNG 文件结束

四、辅助数据块(Ancillary Chunks,可选)

这些块提供额外信息,解码器可选择忽略:

  • tRNS:透明度信息(用于灰度、真彩色或调色板图像的 Alpha 通道替代)
  • gAMA:伽马校正信息
  • cHRM:主色度坐标
  • sRGB:标准 RGB 色彩空间
  • iCCP:嵌入 ICC 色彩配置文件
  • tEXt / zTXt / iTXt:文本信息(如作者、版权等)
  • bKGD:背景色建议
  • pHYs:物理像素尺寸(用于打印 DPI)
  • tIME:图像最后修改时间

五、示例:最简 PNG 文件结构

复制代码
89 50 4E 47 0D 0A 1A 0A          ← PNG 签名
00 00 00 0D                      ← IHDR 长度 = 13
49 48 44 52                      ← "IHDR"
...(13 字节图像头数据)...
CRC(4 字节)
00 00 00 XX                      ← IDAT 长度
49 44 41 54                      ← "IDAT"
...(压缩的图像数据)...
CRC
00 00 00 00                      ← IEND 长度 = 0
49 45 4E 44                      ← "IEND"
AE 42 60 82                      ← IEND 的 CRC(固定值)

六、参考标准

  • 官方规范:RFC 2083
  • 最新版本:PNG Specification (Third Edition),ISO/IEC 15948:2003

如需解析或生成 PNG 文件,可使用如 libpng(C/C++)、Pillow(Python)、pngjs(JavaScript)等库。是否需要代码示例?

相关推荐
云飞云共享云桌面21 小时前
研发部门使用SolidWorks和ug,cad,设计共享云桌面应该怎么选?
运维·服务器·网络·人工智能·3d
亚空间仓鼠21 小时前
OpenEuler系统常用服务(十)
linux·运维·服务器·网络
艾莉丝努力练剑21 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
同聘云21 小时前
阿里云国际站 服务器的“客户端” (Client) 和 “服务器” (Server)到底是什么?有什么区别?
服务器·网络·阿里云·云计算·云小强
邓霖涛21 小时前
nginx使用openSSL自签生成https相关证书
服务器·nginx·https
程序员老邢1 天前
【技术底稿 10】16G Ubuntu 服务器手动部署 Ollama 0.20.4 全流程(避坑 HTTP2 错误)
服务器·ubuntu·ai·语言模型·devops
饼瑶1 天前
Isaac Sim 5.0.0 Docker 部署手册(实验室服务器)
服务器·docker·容器
dddddppppp1231 天前
linux head.s 从第一条指令到start_kernel
linux·运维·服务器
Huanzhi_Lin1 天前
Nginx本地资源服务器-常用脚本
服务器·前端·nginx·batch·静态资源服务器
jiayong231 天前
第 4 课:怎么把一个大页面拆成多个组件
运维·服务器·前端