PNGイメージのデータ構造を知ってみる(2)
前回PNGイメージのデータ構造を知ってみる(1)の続きです。
前回はPNGファイルの基本的な構造であるチャンクとその中でも必須チャンクについて紹介しました。
今回は補助チャンクについて紹介しようと思います。
補助チャンク
補助チャンクは設置は必須ではない、PNGの情報を補助する目的のデータが含まれます。
透明度の情報や、ガンマの情報など
tRNS
透明度情報
もし tRNS チャンクが存在するなら、最初の IDAT チャンクにの前に置かれ、あるのなら、PLTE チャンクの後ろに置かれる必要があります。
tRNS はカラータイプ 4, 6 ではすでに完全なαチャンネルがすでに与えられているので禁止されています。
カラータイプが 3(インデックスカラー)の場合、tRNS チャンクは PLTE チャンクのエントリに一致した 1byte のα値の連続を格納します。0(透明)~255(不透明)
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でtRNS |
0x00(1) | Chunk Data | パレットNo.1 のα値 0-255 |
0x00(1) | 〃 | パレットNo.2 のα値 0-255 |
0x00(1) | 〃 | パレットNo.3 のα値 0-255 |
: | : | : |
0x—-(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
カラータイプが 0(グレイスケール)の場合、tRNS チャンクはひとつのグレイレベル値を格納します。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でtRNS |
0x0008(2) | Chunk Data | グレイレベル 0 ~ (2^bitdepth)-1 |
0x000A(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
(イメージのビット深度が 16 より少ないとき、下位ビットが使われほかは 0 です)。指定されたグレイレベルのピクセルは透明として扱い(α値 0 に相当)、ほかのすべてのピクセルは完全な不透明として扱います(α値 2bitdepth-1 )。
カラータイプが 2 (トゥルーカラー)の場合、tRNS チャンクはひとつの RGB カラー値を格納します。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でtRNS |
0x0008(2) | Chunk Data | R 0 ~ (2^bitdepth)-1 |
0x000A(2) | Chunk Data | G 0 ~ (2^bitdepth)-1 |
0x000C(2) | Chunk Data | B 0 ~ (2^bitdepth)-1 |
0x000E(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
(イメージのビット深度が 16 より少ないとき、下位ビットが使われほかは 0 です)。指定されたカラー値のピクセルは透明として扱い(α値 0 に相当)、ほかのすべてのピクセルは完全な不透明として扱います(α値 2bitdepth-1 )。
gAMA
イメージガンマ
γ値の 100000 倍相当の 4byte の無符号整数としてエンコードされます。たとえば、1/2.2 のγ は 45455 として保存されます。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でgAMA |
0x0008(4) | Chunk Data | 100000倍したγ値 |
0x000C(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
cHRM
基礎色度
アプリケーションがデバイス独立の色定義を PNG ファイルで必要とするなら、イメージ中で基礎的に使われる赤、緑、青の 1931 CIE x,y 色度と基準の白点を指定する cHRM チャンクを使うことができます。
それぞれの値は x や y の値を 100000 倍した 4byte の無符号整数としてエンコードされます。
たとえば、0.3127 の値は 整数 31270 として保存されます。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でgAMA |
0x0008(4) | Chunk Data | 100000倍したWhite Point x |
0x000C(4) | Chunk Data | 100000倍したWhite Point y |
0x0010(4) | Chunk Data | 100000倍したR x |
0x0014(4) | Chunk Data | 100000倍したR y |
0x0018(4) | Chunk Data | 100000倍したG x |
0x001C(4) | Chunk Data | 100000倍したG y |
0x0020(4) | Chunk Data | 100000倍したB x |
0x0024(4) | Chunk Data | 100000倍したB y |
0x0028(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
sRGB
標準RGBカラースペース
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でsRGB |
0x0008(1) | Chunk Data | Rendering intent 色の解釈の仕方 |
0x0009(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
解釈に以下の値が定義されています
0: Perceptual 1: Relative colorimetric 2: Saturation 3: Absolute colorimetric
Perceptual 解釈は写真のような比色分析に正確さに重点を置いた出力装置全般に適応しています。
Relative colorimetric 解釈はロゴのようなカラーアピアランスの一致(出力装置の白点に比例した)に向いています。
Saturation 解釈は図やグラフのような色相や明度の保存に重点を置いたイメージに向いています。
Absolute colorimetric 解釈は試験(異なる出力装置のためのプレビュウイメージ)のような比色の絶対値の保存が必要なイメージに向いています。
iCCP
組み込みICCプロフィール
iCCP チャンクが現れたときは、最初の IDAT チャンクの前に置かれ、PLTE チャンクが存在するならその前に置かれる必要があります。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でiCCP |
0x0008(1-79) | Chunk Data | Profile name |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(1) | Chunk Data | Compression method |
0x00–(n) | Chunk Data | Compressed profile |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
テキスト情報
iTXt、tEXt、zTXt チャンクはイメージに関連したテキスト情報を伝達します。
それぞれの text チャンクはテキスト文字列によって表現される情報の種類を表示するキーワードを最初のフィールドに格納します。
以下のキーワードがあらかじめ定義され、適切に使われるべきものです。
キーワード | |
---|---|
Title | Short (one line) title or caption for image |
Author | Name of image’s creator |
Description | Description of image (possibly long) |
Copyright | Copyright notice |
Creation Time | Time of original image creation |
Software | Software used to create the image |
Disclaimer | Legal disclaimer |
Warning | Warning of nature of content |
Source | Device used to create the image |
Comment | Miscellaneous comment; conversion from GIF comment |
tEXt
テキストデータ
イメージと一緒に記録しようとするテキスト情報は tEXt チャンクに保存することができます。
それぞれの tEXt チャンクはひとつのキーワード(上記参照)とテキスト文字列を次の形式で格納します。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字でtEXt |
0x0008(1-79) | Chunk Data | キーワード |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(n) | Chunk Data | Text |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
キーワードとテキスト文字列はNULL 文字によって区別されます。
キーワードもテキスト文字列もどちらも NULL 文字を含めることはできません。
テキスト文字列が NULL で終わらないことに注意してください。
テキスト文字列は 0byte からチャンクサイズが許す最大値からキーワードと分割子を除いたサイズまでのどんな長さも可能です。
zTXt
圧縮されたテキストデータ
キーワードと NULL 分割子は tEXt チャンクと全く同じです。キーワードは圧縮されていないことに注意してください。圧縮手法バイトはこの zTXt チャンクの中で使われる圧縮手法を示しています。現在定義さえている唯一の値は 0 (deflate/inflate 圧縮)です。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008(1-79) | Chunk Data | キーワード |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(1) | Chunk Data | Compression method |
0x00–(n) | Chunk Data | Compressed Text |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
iTXt
国際的なテキストデータ
このチャンクは意味的には tEXt と zTXt チャンクと等価ですが、テキストデータが Latin-1 の代わりに UTF-8 でエンコードされた Unicode 文字です。
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008(1-79) | Chunk Data | キーワード |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(1) | Chunk Data | Compression flag 0 or 1 |
0x00–(1) | Chunk Data | Compression method |
0x00–(0~) | Chunk Data | Language tag |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(0~) | Chunk Data | Translated keyword |
0x00–(1) | Chunk Data | Null separator ヌル文字 |
0x00–(0~) | Chunk Data | Text |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
圧縮フラグは 0 が無圧縮のテキスト、1 が圧縮されたテキストです。
テキスト領域のみが圧縮される可能性があります。
現在定義されている唯一の圧縮手法バイトが deflate 圧縮による zlib データストリームを意味する 0 です。
圧縮されてないテキストには、エンコーダは圧縮手法に 0 をセットするべきで、デコーダはそれを無視するべきでしょう。
bKGD
背景色
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
pHYs
物理的なピクセル寸法
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
sBIT
有効なビット
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
sPLT
推奨パレット
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
hIST
パレットヒストグラム
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
tIME
イメージの最終更新時間
オフセット(サイズ) | 名称 | 役割,補足 |
---|---|---|
0x0000(4) | Length | Dataの長さを表す |
0x0004(4) | Chunk Type | Chankの種類を表す,ASCII文字で |
0x0008() | Chunk Data | |
0x00–(4) | CRC | Chank TypeとChunk Dataをもとに計算される |
標準チャンクの要約
この表は標準的なチャンク形式の属性の要約です。
必須チャンク
PLTE が任意であることを除いて、この順番で現れる必要があります
名前 | 複数個 OK? | 順番の制限 |
---|---|---|
IHDR | No | 最初 |
PLTE | No | IDAT の前 |
IDAT | Yes | 複数の IDAT は連続 |
IEND | No | 最後 |
補助チャンク
この順番で現れる必要はありません
名前 | 複数個 OK? | 順番の制限 |
---|---|---|
cHRM | No | PLTE、IDAT の前 |
gAMA | No | PLTE、IDAT の前 |
iCCP | No | PLTE、IDAT の前 |
sBIT | No | PLTE、IDAT の前 |
sRGB | No | PLTE、IDAT の前 |
bKGD | No | PLTE の後、IDAT の前 |
hIST | No | PLTE の後、IDAT の前 |
tRNS | No | PLTE の後、IDAT の前 |
pHYs | No | IDAT の前 |
sPLT | Yes | IDAT の前 |
tIME | No | None |
iTXt | Yes | None |
tEXt | Yes | None |
zTXt | Yes | None |