png文件结构与信息隐藏
PNG(Portable Network Graphics),PNG supports palette-based images (with palettes of 24-bit RGB or 32-bit RGBA colors), grayscale images (with or without alpha channel for transparency), and full-color non-palette-based RGB/RGBA images (with or without alpha channel).
文件格式
file header
固定的8byte:
89 50 4E 47 0D 0A 1A 0A
其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理
“Chunks” within the file
length | chunk type | chunk data | crc |
---|---|---|---|
4byte | 4byte | length | 4bytes |
关键数据块(critical chunks)
(1) 文件头数据块IHDR(header chunk)
- 包含PNG文件的基本信息
- 一个PNG数据流中只能有一个IHDR
- 必须在PNG文件最前面
(2) 调色板数据块PLTE(palette chunk)
- 包含有与索引彩色图像(indexed-color image)相关的彩色变换数据
- 必须在IDAT之前
(3) 图像数据块IDAT(image data chunk)
- 存储实际的数据
- 可存在多个
- 必须与其他IDAT连续
(4) 图像结束数据IEND(image trailer chunk)
- 固定格式,16进制为: 00 00 00 00 49 45 4E 44 AE 42 60 82
- 必须在PNG文件最尾部
IHDR详细结构
域的名称 | 字节数 | 说明 |
---|---|---|
Width | 4 | 图像宽度,以像素为单位 |
Height | 4 | 图像高度,以像素为单位 |
Bit depth | 1 | 图像深度:索引彩色图像:1,2,4或8; 灰度图像:1,2,4,8或16; 真彩色图像:8或16 |
ColorType | 1 | 颜色类型:0:灰度图像, 1,2,4,8或16; 2:真彩色图像,8或16; 3:索引彩色图像,1,2,4或8; 4:带α通道数据的灰度图像,8或16; 6:带α通道数据的真彩色图像,8或16 |
Compression method | 1 | 压缩方法(LZ77派生算法) |
Filter method | 1 | 滤波器方法 |
Interlace method | 1 | 隔行扫描方法:0:非隔行扫描; 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
辅助数据块(ancillary chunks)
用于辅助指示PNG图像中的层、文字等信息
可删除,不影响图片浏览,但图像将失去原来的可编辑性
(1) 背景颜色数据块bKGD(background color)
(2) 基色和白色度数据块cHRM(primary chromaticities and white point)
(3) 图像γ数据块gAMA(image gamma)
(4) 图像直方图数据块hIST(image histogram)
(5) 物理像素尺寸数据块pHYs(physical pixel dimensions)
(6) 样本有效位数据块sBIT(significant bits)
(7) 文本信息数据块tEXt(textual data)
(8) 图像最后修改时间数据块tIME (image last-modification time)
(9) 图像透明数据块tRNS (transparency)
(10) 压缩文本数据块zTXt (compressed textual data)
reference:
https://en.wikipedia.org/wiki/Portable_Network_Graphics
https://www.cnblogs.com/lidabo/p/3701197.html
https://3gstudent.github.io/3gstudent.github.io/隐写技巧-利用PNG文件格式隐藏Payload/
https://xz.aliyun.com/t/1833
Author: damn1t
Link: http://microvorld.com/2019/04/10/misc/png隐写/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.