オーディオとビデオのエントリ - 11 - PNGファイル形式の詳細

*オーディオおよびビデオハウツー記事へのディレクトリ*

PNGファイル形式の解析

PNG画像フォーマットファイル署名ドメインおよびPNGファイル(IHDR、IDAT、IEND)組成物の8バイトの三つ以上の後続のブロック。

PNGファイル署名ファイルは、PNG形式の8バイト(89 50 4E 47 0D 0A 1Aは0A 16進数)を含みます。

進ビューアで任意のPNGファイルを開くと、このヘッドを見ることができます:

PNG  - ヘキサファイルsignture.png

PNGは、データ・ブロックの2種類定義されています。また、キーブロック(必須チャンク)によってサポートされなければならない1は、ソフトウェアを読み書き、PNGファイルが含まれている必要がありますが、他の二次ブロック(補助チャンク)と呼ばれ、PNGは、ソフトウェアがそれを無視することができます追加ブロックは知りません。拡大したときに、このブロックベースの設計データは、PNG形式を許可すると、旧バージョンとの互換性を維持することができます。

データ・ブロックの概要

PNGは、データ・ブロック内のカテゴリテーブルで、データブロックキー部は、区別するために強調しました。

データシンボルブロック データブロックの名前 マルチブロック オプションです 位置リミット
IHDR 文件头数据块 第一块
cHRM 原色とブロックの白色点 ノー それはあります PLTEとIDATの前に
レンジ 画像データブロックγ ノー それはあります PLTEとIDATの前に
SBIT サンプルデータブロックの有効ビット ノー それはあります PLTEとIDATの前に
PLTE 调色板数据块 在IDAT之前
BKGD 背景色データブロック ノー それはあります PLTE IDAT前後
HIST 画像ヒストグラムデータブロック ノー それはあります PLTE IDAT前後
TRNS 透明画像データブロック ノー それはあります PLTE IDAT前後
オフ (専用のパブリックデータブロック) ノー それはあります IDATの前に
PHYS 物理的なピクセルデータブロックサイズ ノー それはあります IDATの前に
SCAL (専用のパブリックデータブロック) ノー それはあります IDATの前に
IDAT 图像数据块 与其他IDAT连续
時間 最終更新画像データブロック ノー それはあります アンリミテッド
テキスト 情報のテキストブロック それはあります それはあります アンリミテッド
zTXt テキストの圧縮データ・ブロック それはあります それはあります アンリミテッド
FRAC (専用のパブリックデータブロック) それはあります それはあります アンリミテッド
gIFg (専用のパブリックデータブロック) それはあります それはあります アンリミテッド
贈り物 (専用のパブリックデータブロック) それはあります それはあります アンリミテッド
gIFx (専用のパブリックデータブロック) それはあります それはあります アンリミテッド
IEND 图像结束数据 最后一个数据块

私達はちょうどすることができ、キーのデータブロックに焦点を当てています。

データブロックは、4つの主要なデータ・ブロックがあります。

  • ヘッダデータブロックIHDRは、(ヘッダチャンク):画像の基本的な情報が含まれ、それは、第1のデータブロックとして表示され、一度だけ。
  • パレットデータブロックPLTE(パレットチャンク):画像データのブロックの前に配置されなければなりません。
  • 画像データブロックIDAT(画像データチャンク):実際の画像データを記憶します。PNGデータは、連続的な画像データの複数のブロックを含有することができます。
  • エンド・画像データIEND(画像トレーラーチャンク):ファイルの最後に、PNGデータストリームの終わりを示します。

おそらく、このように、一緒にすべてをブロックします:

PNG識別子 PNGデータブロック(IHDR) PNGデータブロック(データブロックの他のタイプ) ... データブロックのPNG端(IEND)

データブロック構造

PNGファイルは、(等IHDR、IDAT、など)データの各ブロックは、4つの部分で構成されます。

名前 バイトカウント 説明
長さ(長さ) 4つのバイト データフィールド内のデータブロックの長さは、以下(2 ^ 31-1)バイトの長さを指定します
チャンクタイプコード(ブロックタイプコード) 4つのバイト 文字からなるASCIIデータブロックタイプコード(AZおよびAZ)構成
チャンクデータ(ブロックデータ) 可変長 指定されたストレージのデータチャンクタイプコードによると、
CRC(巡回冗長検査) 4つのバイト 格納された巡回冗長エラーかどうかを検出します
  • 値はCRC(巡回冗長検査)フィールドは、データフィールドであり、チャンクタイプ・コード・フィールドのチャンクデータを算出しました。
  • 注:長さ自体、チャンクタイプコード、CRC外側、すなわちチャンクデータ長の長さ:長さ値に加えてあります。

データブロック - ブロックIHDRヘッダ

なお、画像データのPNGファイルに格納された基本情報が含まれており、PNGデータストリームの最初のデータブロック、及びPNGデータストリームのみ1つのヘッダブロックとして表示されます。

ヘッダブロックは、データの13バイトで構成されています。

ドメイン名 バイトカウント 説明
4つのバイト ピクセル単位での画像の幅、
高さ 4つのバイト ピクセル単位での画像の高さ
ビット深度 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
圧縮方法 1つのバイト ここで指定したPNG仕様は常に0で使用する圧縮方法(LZ77アルゴリズム由来)という、
フィルター方式 1つのバイト ここで指定したPNG仕様は常に0で、フィルタ法
インターレース方式 1つのバイト 飛び越し走査方式:0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

進ビューアでPNGファイルを開きます。

PNG  - ヘキサihdr.png

六角 説明
00 00 00 0D データブロック長の13のバイト
49 48 44 52 ASCII文字のブロックタイプコード「IHDR」
1D 00 00 04 画像の幅1053
00 00 02 B3 画像の高さ691
08 图像深度 8
06 带α通道数据的真彩色图
00 压缩方法
00 滤波器方法
00 隔行扫描方法:00非隔行扫描
52 C3 75 3A CRC (循环冗余检测)

数据块-调色板数据块 PLTE

包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。

PLTE 数据块是定义图像的调色板信息,PLTE 可以包含 1~256 个调色板信息,每一个调色板信息由 3 个字节组成:

颜色 字节 意义
Red 1 byte 0 = 黑色, 255 = 红
Green 1 byte 0 = 黑色, 255 = 绿色
Blue 1 byte 0 = 黑色, 255 = 蓝色
  • 调色板的长度应该是 3 的倍数,否则,这将是一个非法的调色板。

  • 对于索引图像,调色板信息是必须的,调色板的颜色索引从 0 开始编号,然后是 1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为 4 的时候,调色板中的颜色数不可以超过 2^4=16),否则,这将导致 PNG 图像不合法。

  • 真彩色图像和带 α 通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

用十六进制查看器打开一个索引图像 PNG 文件:

PNG-インデックスカラー - ヘキサplte.png

十六进制 说明
00 00 00 27 数据块长度 39 字节
50 4C 54 45 数据块类型码 “PLTE” 的 ASCII 字母
B7 00 34 FF 99 00 60 00 73 FF 0F 00 FF ED 00 09 00 B2 FF 66 00 FF 3B 00 E2 00 15 8B 00 54 FF C1 00 33 00 99 FF FF 00 调色板颜色 13 个
48 29 75 2C CRC (循环冗余检测)

预览调色板中的颜色:

インデックスカラー-PLTE-colors.png

数据块-图像数据块 IDAT

它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT 存放着图像真正的数据信息,因此,如果能够了解 IDAT 的结构,我们就可以很方便的生成 PNG 图像。

用十六进制查看器打开一个索引图像 PNG 文件:

PNG  - ヘキサidat.png

十六进制 说明
00 00 00 D3 数据块长度 211 字节
49 44 41 54 数据块类型码 “IDAT” 的 ASCII 字母
78 9C ...... 压缩的数据 211 字节,LZ77 派生压缩方法
52 98 5D 9D CRC (循环冗余检测)

图像数据块 IDAT 细节在本文下半部分有详细分析

数据块-图像结束数据 IEND

它用来标记 PNG 文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察 PNG 文件,我们会发现,文件的结尾 12 个字符看起来总应该是这样的:

00 00 00 00 49 45 4E 44 AE 42 60 82

用十六进制查看器打开一个 PNG 文件:

PNG  - ヘキサiend.png

由于数据块结构的定义,IEND 数据块的长度总 是 0(00 00 00 00,除非人为加入信息),数据标识总是 IEND(49 45 4E 44),因此,CRC 码也总是 AE 42 60 82。

图像数据块 IDAT 细节

IDAT 压缩数据细节

PNG Spec 压缩算法部分:

PNG compression method 0 is deflate/inflate compression with a sliding window (which is an upper bound on the distances appearing in the deflate stream) of at most 32768 bytes. Deflate compression is an LZ77 derivative [ZL].

Deflate-compressed datastreams within PNG are stored in the "zlib" format, which has the structure:

- zlib compression method/flags code    1 byte
- Additional flags/check bits   1 byte
- Compressed data blocks    n bytes
- Check value   4 bytes

Further details on this format are given in the zlib specification [RFC-1950].
  • PNG 使用 DEFLATE 压缩算法。
  • DEFLATE 是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
  • DEFLATE 压缩的数据以 zlib 格式存储。
    zlib(RFC1950):一种格式,是对 deflate 进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex)
    gzip(RFC1952):一种格式,也是对 deflate 进行的封装。

    gzip = gzip 头 + deflate 编码的实际内容 + gzip 尾
    zlib = zlib 头 + deflate 编码的实际内容 + zlib 尾

提取&解压 IDAT 中压缩数据

Windows 上可以用 [hexeditor](https://www.hhdsoftware.com/free-hex-editor)
Mac 上可以用 [hexfiend](http://ridiculousfish.com/hexfiend/)、[Hopper Disassembler](https://www.hopperapp.com/)

png-hex-idat-data-extract.png

使用 zlib 解压 78 9C ...... 压缩的数据字节:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "zlib.h"

int main() {
    FILE *inFile = fopen("/Users/staff/Desktop/indexed-color-image.data", "rb");
    FILE *outFile = fopen("/Users/staff/Desktop/indexed-color-image-uncompress.data", "wb");
    
    fseek(inFile, 0L, SEEK_END);
    long size = ftell(inFile);
    fseek(inFile, 0L, SEEK_SET);

    uint8_t dataBuf[size];
    fread(dataBuf, size, 1, inFile);
    printf("压缩文件大小:%ld\n", size);

    uint8_t destBuf[1500000]={0};
    uint32_t destLen = 0;

    uncompress(destBuf, &destLen, dataBuf, size);
    printf("解压后大小:%d\n", destLen);

    fwrite(destBuf, destLen, 1, outFile);

    fflush(outFile);
    fclose(inFile);
    fclose(outFile);

    return 0;
}

png-hex-idat-uncompress.png
png-hex-idat-uncompress-contrast.png

分析解压后的数据

PNG Spec 7.1 Integers and byte order

All integers that require more than one byte shall be in network byte order (as illustrated in figure 7.1): the most significant byte comes first, then the less significant bytes in descending order of significance (MSB LSB for two-byte integers, MSB B2 B1 LSB for four-byte integers). The highest bit (value 128) of a byte is numbered bit 7; the lowest bit (value 1) is numbered bit 0. Values are unsigned unless otherwise noted. Values explicitly noted as signed are represented in two's complement notation.
  • PNG 使用网络字节序 大端字节序(Big Endian)

PNG Spec 7.2 Scanlines

In PNG images of colour type 0 (greyscale) each pixel is a single sample, which may have precision less than a byte (1, 2, or 4 bits). These samples are packed into bytes with the leftmost sample in the high-order bits of a byte followed by the other samples for the scanline.

In PNG images of colour type 3 (indexed-colour) each pixel is a single palette index. These indices are packed into bytes in the same way as the samples for colour type 0.
  • PNG 图像深度小于 1 字节,将会被 packed into bytes

PNG Spec 7.3 Filtering

PNG allows the scanline data to be filtered before it is compressed. Filtering can improve the compressibility of the data. The filter step itself results in a sequence of bytes of the same size as the incoming sequence, but in a different representation, preceded by a filter type byte. Filtering does not reduce the size of the actual scanline data. All PNG filters are strictly lossless.

Different filter types can be used for different scanlines, and the filter algorithm is specified for each scanline by a filter type byte. The filter type byte is not considered part of the image data, but it is included in the datastream sent to the compression step. An intelligent encoder can switch filters from one scanline to the next. The method for choosing which filter to employ is left to the encoder.
  • 每一扫描行前有一字节用于指定过滤器类型

PNG Spec Filters:

Filtering transforms the PNG image with the goal of improving compression. PNG allows for a number of filter methods. All the reduced images in an interlaced image shall use a single filter method. Only filter method 0 is defined by this International Standard. Other filter methods are reserved for future standardization (see 4.9 Extension and registration). Filter method 0 provides a set of five filter types, and individual scanlines in each reduced image may use different filter types.
。。。。。。
  • 文件头数据块 IHDR 中 Filter method 过滤方法只能是 0。
  • Filter method=0 定义了 5 种 Filter Type 过滤器类型: 0:None1:Sub2:Up3:Average4:Paeth

当 PNG 图片是索引图像时(下图数据:图像深度: 4 尺寸 256X256 过滤器类型: 0:None 隔行扫描方法:0:非隔行扫描):

indexed-color-image.png

png-indexed-color-uncompress-data.png

  • 每个高亮区域前面一个字节 00 代表 过滤器类型 : 0:NonePNG Spec 7.3 Filtering】【 PNG Spec Filters】。
  • 如果高亮区域前面一个字节不是 00,高亮区将不是扫描行索引数据,需要参考 【PNG Spec 9.2 Filter types for filter method 0
  • 每种颜色高亮显示的部分 128 字节 是一个扫描行颜色索引数据,因为 图像深度:4,所以每个字节代表两个颜色索引 【PNG Spec 7.2 Scanlines】。
  • 如字节 55 是十六进制,二进制为 01010101,前四 bit 位代表一个颜色索引 0101 十进制为 5,后四 bit 位代表一个颜色索引 0101 十进制为 5 。

当 PNG 图片是真彩图像时(下图数据:图像深度: 8 尺寸 70X70 过滤器类型: 0:None 隔行扫描方法:0:非隔行扫描):

true-color-image.png

png-true-color-uncompress-data.png

  • 每个高亮区域前面一个字节 00 代表 过滤器类型 : 0:NonePNG Spec 7.3 Filtering】【 PNG Spec Filters】。
  • 以前のバイトが強調表示された領域でない場合は00、ハイライト色データ走査線がを参照する必要はありません[ フィルタ方法をPNG仕様9.2フィルタタイプ 0 ]
  • 各部分は色が強調表示された210 字节ため、カラーラインスキャンデータである真彩图片 图像深度:8カラーピクセルのため、すべての3つのバイトを表します。
  • そのようなバイトとしてFF 00 00、ピクセルのRGBカラーを表します。

もっと

次に、コード内で手動で記事のディレクトリをPNG画像を生成:* *オーディオとビデオの入門記事のディレクトリ

可能な答えのすべての問題:PNG仕様


コード:
デモ/デモ-zlibの

参考文献:

詳細PNGファイル形式

PNG、JPEG、BMPおよび他の画像形式いくつかの説明(A) - PNG

詳細PNGファイル構造

「PNGファイル形式」(ⅱ)PNGファイル形式の解析

知識の写真の並べ替え(A):PNGファイルの構造

ステガノグラフィ技術 - ペイロードを非表示にするにはPNGファイル形式を使用します

ポータブルネットワークグラフィックス(PNG)仕様と拡張機能

gzipで、収縮、zlibの差別

zlibライブラリのインストールと使用

コンテンツが正しくありませんか?著者にお問い合わせください:

联系作者


ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!

おすすめ

転載: www.cnblogs.com/binglingziyu/p/audio-video-basic-11-png-file-format-detail.html