当前位置: 首页 > news >正文

PNG文件格式理解

PNG图片字节排序为大端序:

  • 小端序:低位低地址(符合CPU阅读习惯)
  • 大端序:低位高地址(符合人类阅读习惯)✔

1、魔术字/签名

固定八个字节89 50 4E 47 0D 0A 1A 0A用于表示这是个PNG文件

2、IHDR

后续的段都有一个类似的格式:长度+字段+数据/信息+CRC校验

包含:长度(4字节)+IHDR(4字节)+信息数据(13字节)+CRC校验(4字节)
image

  • 长度:指数据部分(信息数据)的字节长度
  • IHDR:对应十六进制为49 48 44 52
  • 信息数据:
    • 宽度(4字节)
    • 长度(4字节)
    • 位深度(1字节):图中为8,表示一个像素的采样深度为8位,2^8 = 256个阶梯
    • 颜色类型color_type(1字节):图中为2表示RGB
    • compare_method(1字节):默认为0
    • filter_method(1字节):默认为0
    • interlace_method(1字节):默认为0,非隔行扫描
  • CRC校验(4字节):注意每层的CRC校验都是对字段+信息数据的校验,如IHDR层就是对 IHDR+数据信息校验

3、IDAT

数据段,IDAT段可有许多个,IDAT从前往后逐一代表图片从上到下的数据,比如把一个图片的IDAT段删到只剩下第一个,那么图片将会显示最上面一行的画面,其余全黑

结构如下:

  • 长度(4字节):指数据部分的字节长度
  • IDAT(4字节):固定为49 44 41 54
  • 数据:理论上可有 2^32-1字节,约4.29GB,理论上限由长度4字节全为FF推断出来。但由于实际打开图片需要占用内存,一般数据段不会赛这么多
  • CRC校验(4字节):对 IDAT+数据的校验

4、IEND

  • 长度(4字节):由于IEND段表示结束,没有任何数据,因此长度固定为0
  • IEND:固定为49 45 4E 44
  • 数据: 无,直接接CRC就行
  • CRC: 紧跟IEND字段,由于没有数据,CRC校验也固定为对IEND字段的校验:AE 42 60 82

因此IEND整段数据都是已知固定的12字节:00 00 00 00 49 45 4E 44 AE 42 60 82

5、pHYs和tExt段

部分截图软件创建的图片还会在IHDR后、IDAT前加上备注信息,常在tEXT段。这些段可有可无,删了也不会影响图片显示
image

如图:这是一张有Snipaste软件创建的截图,tExt段就被它加上了自己的注释

http://www.jsqmd.com/news/359166/

相关文章:

  • 金碧荷(也有叫红塔金秋的),云南特产,是春兰与豆瓣兰的自然串种瑰宝。保山农民街看到过2026年2月8日
  • 从Java到AI:我的转型之路 Ⅱ —— 手撸一个DeepSeek工具库
  • Qt-qrc机制简单介绍
  • RustFS高可用集群部署实战:轻松搭建企业级分布式存储架构
  • 信不信?这个 SQL 题,可以难倒大部分人
  • Qt——多媒体
  • 浏览器(如chrome)代理抓包时提示Your Connection is not private 问题临时处理
  • 我有 8种从 Spring中获取 Bean的方式!
  • CAPL学习-ETH功能函数-方法类2 - 详解
  • 小程序毕设项目:基于springboot+小程序的个性化食谱推荐系统小程序(源码+文档,讲解、调试运行,定制等)
  • 【毕业设计】基于springboot+小程序的个性化食谱推荐系统小程序(源码+文档+远程调试,全bao定制等)
  • 通信
  • 高并发
  • SPI 这么玩就很优雅!
  • 40 个定时任务,完美诠释 RocketMQ 设计精髓!
  • 数字图像处理篇---JPEG2000
  • 关于centos-stream调整开机级别后蓝牙使用问题
  • RabbitMQ 保证消息不丢失的几种手段
  • C++11实现线程池
  • 金碧荷,云南特产,是春兰与豆瓣兰的自然串种瑰宝
  • MySQL 索引失效跑不出这 8 个场景
  • 墨江双龙烧烤城(每周3周6)赶集才有人
  • 数字图像处理篇---图像的小波变换
  • 【计算机毕业设计案例】基于微信小程序的健康饮食推荐系统基于springboot+小程序的个性化食谱推荐系统小程序(程序+文档+讲解+定制)
  • 技术面试官视角:除了代码,更看重候选人的哪些潜质与特质?
  • 数字图像处理---压缩编码
  • 线上 OOM 了!热乎的!
  • 【计算机毕业设计案例】基于springboot+小程序的自助停车缴费系统小程序基于微信小程序的自助停车缴费系统停车场车位预约(程序+文档+讲解+定制)
  • 手写三高支付网关的设计与实现:基于Java17与Netty的核心架构!
  • 数字图像处理篇---路径模糊