Snippets
Created by
cia_rana
last modified
APNGの構造メモ
PNG
Portable Network Graphics。
全体構造
PNGの構造は非常に単純で、ファイルをPNG画像と認識するためのシグネチャと、様々なデータを表すチャンクからなる。
PNGの構造 |
---|
シグネチャ |
チャンク1 |
チャンク2 |
︙ |
チャンクN |
シグネチャ
16進数表記 | 内容 |
---|---|
0x89 | 非ASCII文字 |
0x50 | P |
0x4e | N |
0x47 | G |
0x0d | CR(Ctrl+U) |
0x0a | LF(Ctrl+J) |
0x1a | Ctrl+Z |
0x0a | LF(Ctrl+J) |
チャンク
様々なデータを表す。PNGに必ず必要な必須チャンクと補助的な役割を果たす補助チャンクがある。
- length(4byte)
- dataの長さ
- ネットワークバイトオーダ(ビッグエディアン)
- type(4byte)
- チャンクの種類
- data(length byte(単位:byte))
- チャンクのデータ
- CRC(4byte(CRC-32を使用))
- typeとdataから算出されるハッシュ値
- Cyclic Redundancy Check(巡回冗長検査)、誤り検知に使用
必須チャンク
PNGに必須のチャンク
- IHDR(25byte)
- チャンクの中で一番先頭に配置される
- data部は以下の順で格納される
- 画像の幅(4byte)
- 画像の高さ(4byte)
- 色深度(1バイト)
- カラータイプ(1byte)
- 圧縮形式(1byte)
- フィルタ形式(1byte)
- インターレース形式(1byte)
- IDAT(可変長byte)
- 画像の実データ
- IEND(12byte)
- 画像の終端
APNG
Animated PNG。Animated GIFと違って24bitトゥルーカラーの表現や透過イメージを使用できる。 PNG仕様に'acTL'、'fcTL'、'fdAT'の3つの補助チャンクを追加したPNG拡張である。PNGの後方互換性を保っており、APNGに対応していないPNGデコーダはAPNG仕様のチャンクを除き、静止画(デフォルト画像)を表示する。
チャンクシーケンス
'fcTL'と'fdAT'はシーケンス番号を持ち、シーケンスを共有する。これはAPNGのシーケンスエラーを検知するために利用さる。シーケンス番号の欠番や重複を検知する。
シーケンス番号は0から始まるが、デフォルト画像を使用する場合としない場合とで、シーケンスの仕様が異なる。
デフォルト画像を使用する場合
シーケンス番号 | チャンク |
---|---|
なし | 'acTL' |
0 | 'fcTL'(1フレーム目を指定) |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像1) |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像2) |
︙ | ︙ |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像n1) |
1 | 'fcTL'(2フレーム目を指定) |
2 | 'fdAT'(2フレーム目で使う画像1) |
3 | 'fdAT'(2フレーム目で使う画像2) |
︙ | ︙ |
3+n2 | 'fdAT'(2フレーム目で使う画像n2) |
3+n2+1 | 'fcTL'(3フレーム目を指定) |
3+n2+2 | 'fdAT'(3フレーム目で使う画像1) |
︙ | ︙ |
デフォルト画像を使用する場合
シーケンス番号 | チャンク |
---|---|
なし | 'acTL' |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像1) |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像2) |
︙ | ︙ |
なし | 'IDAT'(1フレーム目で使う画像兼デフォルト画像n1) |
0 | 'fcTL'(2フレーム目を指定) |
1 | 'fdAT'(2フレーム目で使う画像1) |
2 | 'fdAT'(2フレーム目で使う画像2) |
︙ | ︙ |
2+n2 | 'fdAT'(2フレーム目で使う画像n2) |
2+n2+1 | 'fcTL'(3フレーム目を指定) |
2+n2+2 | 'fdAT'(3フレーム目で使う画像1) |
︙ | ︙ |
'acTL'
Animation Controlチャンク。アニメーション全体の方法を定義する。'IDAT'の前に存在しなければならない。
fcTL'
Frame Controlチャンク。各フレームの描画方法を定義する。対象フレームの'IDAT'または'fdAT'の前に存在しなければならない。
'fdAT'
Frame Dataチャンク。'IDAT'と同じ目的のデータ。先頭がシーケンス番号で始まってる以外は'IDAT'と同じ構造である。
参考
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.