PNGイメージのデータ構造を知ってみる(2)

前回PNGイメージのデータ構造を知ってみる(1)の続きです。

前回はPNGファイルの基本的な構造であるチャンクとその中でも必須チャンクについて紹介しました。
今回は補助チャンクについて紹介しようと思います。

補助チャンク

補助チャンクは設置は必須ではない、PNGの情報を補助する目的のデータが含まれます。
透明度の情報や、ガンマの情報など

tRNS

透明度情報
もし tRNS チャンクが存在するなら、最初の IDAT チャンクにの前に置かれ、あるのなら、PLTE チャンクの後ろに置かれる必要があります。
tRNS はカラータイプ 4, 6 ではすでに完全なαチャンネルがすでに与えられているので禁止されています。

カラータイプが 3(インデックスカラー)の場合、tRNS チャンクは PLTE チャンクのエントリに一致した 1byte のα値の連続を格納します。0(透明)~255(不透明)

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でtRNS
0x00(1)Chunk DataパレットNo.1 のα値 0-255
0x00(1)パレットNo.2 のα値 0-255
0x00(1)パレットNo.3 のα値 0-255
:::
0x—-(4)CRCChank TypeとChunk Dataをもとに計算される

カラータイプが 0(グレイスケール)の場合、tRNS チャンクはひとつのグレイレベル値を格納します。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でtRNS
0x0008(2)Chunk Dataグレイレベル 0 ~ (2^bitdepth)-1
0x000A(4)CRCChank TypeとChunk Dataをもとに計算される

(イメージのビット深度が 16 より少ないとき、下位ビットが使われほかは 0 です)。指定されたグレイレベルのピクセルは透明として扱い(α値 0 に相当)、ほかのすべてのピクセルは完全な不透明として扱います(α値 2bitdepth-1 )。

カラータイプが 2 (トゥルーカラー)の場合、tRNS チャンクはひとつの RGB カラー値を格納します。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でtRNS
0x0008(2)Chunk DataR 0 ~ (2^bitdepth)-1
0x000A(2)Chunk DataG 0 ~ (2^bitdepth)-1
0x000C(2)Chunk DataB 0 ~ (2^bitdepth)-1
0x000E(4)CRCChank TypeとChunk Dataをもとに計算される

(イメージのビット深度が 16 より少ないとき、下位ビットが使われほかは 0 です)。指定されたカラー値のピクセルは透明として扱い(α値 0 に相当)、ほかのすべてのピクセルは完全な不透明として扱います(α値 2bitdepth-1 )。

gAMA

イメージガンマ

γ値の 100000 倍相当の 4byte の無符号整数としてエンコードされます。たとえば、1/2.2 のγ は 45455 として保存されます。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でgAMA
0x0008(4)Chunk Data100000倍したγ値
0x000C(4)CRCChank TypeとChunk Dataをもとに計算される
cHRM

基礎色度

アプリケーションがデバイス独立の色定義を PNG ファイルで必要とするなら、イメージ中で基礎的に使われる赤、緑、青の 1931 CIE x,y 色度と基準の白点を指定する cHRM チャンクを使うことができます。
それぞれの値は x や y の値を 100000 倍した 4byte の無符号整数としてエンコードされます。
たとえば、0.3127 の値は 整数 31270 として保存されます。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でgAMA
0x0008(4)Chunk Data100000倍したWhite Point x
0x000C(4)Chunk Data100000倍したWhite Point y
0x0010(4)Chunk Data100000倍したR x
0x0014(4)Chunk Data100000倍したR y
0x0018(4)Chunk Data100000倍したG x
0x001C(4)Chunk Data100000倍したG y
0x0020(4)Chunk Data100000倍したB x
0x0024(4)Chunk Data100000倍したB y
0x0028(4)CRCChank TypeとChunk Dataをもとに計算される
sRGB

標準RGBカラースペース

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でsRGB
0x0008(1)Chunk DataRendering intent 色の解釈の仕方
0x0009(4)CRCChank 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)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でiCCP
0x0008(1-79)Chunk DataProfile name
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(1)Chunk DataCompression method
0x00–(n)Chunk DataCompressed profile
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される

テキスト情報

iTXt、tEXt、zTXt チャンクはイメージに関連したテキスト情報を伝達します。
それぞれの text チャンクはテキスト文字列によって表現される情報の種類を表示するキーワードを最初のフィールドに格納します。
以下のキーワードがあらかじめ定義され、適切に使われるべきものです。

キーワード
TitleShort (one line) title or caption for image
AuthorName of image’s creator
DescriptionDescription of image (possibly long)
CopyrightCopyright notice
Creation TimeTime of original image creation
SoftwareSoftware used to create the image
DisclaimerLegal disclaimer
WarningWarning of nature of content
SourceDevice used to create the image
CommentMiscellaneous comment; conversion from GIF comment
tEXt

テキストデータ

イメージと一緒に記録しようとするテキスト情報は tEXt チャンクに保存することができます。
それぞれの tEXt チャンクはひとつのキーワード(上記参照)とテキスト文字列を次の形式で格納します。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字でtEXt
0x0008(1-79)Chunk Dataキーワード
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(n)Chunk DataText
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される

キーワードとテキスト文字列はNULL 文字によって区別されます。
キーワードもテキスト文字列もどちらも NULL 文字を含めることはできません。
テキスト文字列が NULL で終わらないことに注意してください。
テキスト文字列は 0byte からチャンクサイズが許す最大値からキーワードと分割子を除いたサイズまでのどんな長さも可能です。

zTXt

圧縮されたテキストデータ
キーワードと NULL 分割子は tEXt チャンクと全く同じです。キーワードは圧縮されていないことに注意してください。圧縮手法バイトはこの zTXt チャンクの中で使われる圧縮手法を示しています。現在定義さえている唯一の値は 0 (deflate/inflate 圧縮)です。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008(1-79)Chunk Dataキーワード
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(1)Chunk DataCompression method
0x00–(n)Chunk DataCompressed Text
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
iTXt

国際的なテキストデータ

このチャンクは意味的には tEXt と zTXt チャンクと等価ですが、テキストデータが Latin-1 の代わりに UTF-8 でエンコードされた Unicode 文字です。

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008(1-79)Chunk Dataキーワード
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(1)Chunk DataCompression flag 0 or 1
0x00–(1)Chunk DataCompression method
0x00–(0~)Chunk DataLanguage tag
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(0~)Chunk DataTranslated keyword
0x00–(1)Chunk DataNull separator ヌル文字
0x00–(0~)Chunk DataText
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される

圧縮フラグは 0 が無圧縮のテキスト、1 が圧縮されたテキストです。
テキスト領域のみが圧縮される可能性があります。
現在定義されている唯一の圧縮手法バイトが deflate 圧縮による zlib データストリームを意味する 0 です。
圧縮されてないテキストには、エンコーダは圧縮手法に 0 をセットするべきで、デコーダはそれを無視するべきでしょう。

bKGD

背景色

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
pHYs

物理的なピクセル寸法

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
sBIT

有効なビット

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
sPLT

推奨パレット

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
hIST

パレットヒストグラム

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される
tIME

イメージの最終更新時間

オフセット(サイズ)名称役割,補足
0x0000(4)LengthDataの長さを表す
0x0004(4)Chunk TypeChankの種類を表す,ASCII文字で
0x0008()Chunk Data
0x00–(4)CRCChank TypeとChunk Dataをもとに計算される

標準チャンクの要約

この表は標準的なチャンク形式の属性の要約です。

必須チャンク

PLTE が任意であることを除いて、この順番で現れる必要があります

名前複数個 OK?順番の制限
IHDRNo最初
PLTENoIDAT の前
IDATYes複数の IDAT は連続
IENDNo最後

補助チャンク

この順番で現れる必要はありません

名前複数個 OK?順番の制限
cHRMNoPLTE、IDAT の前
gAMANoPLTE、IDAT の前
iCCPNoPLTE、IDAT の前
sBITNoPLTE、IDAT の前
sRGBNoPLTE、IDAT の前
bKGDNoPLTE の後、IDAT の前
hISTNoPLTE の後、IDAT の前
tRNSNoPLTE の後、IDAT の前
pHYsNoIDAT の前
sPLTYesIDAT の前
tIMENoNone
iTXtYesNone
tEXtYesNone
zTXtYesNone