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
Memo
連続企画

Djangoクラスベースビューのすヽめ

Memo
連続企画

Djangoでブログを作ろう

GitHub
制作物

Django-Boost

Djangoでの開発を加速する拡張ライブラリ
GitHub
制作物

ktPyString

kotlinにpythonと同等の文字列操作を提供するライブラリ
GitHub
制作物

py_string

c++にpythonと同等の文字列操作を提供するライブラリ
GitHub
制作物

SwiftyPyString

Swiftにpythonと同等の文字列操作を提供するライブラリ