玄関コンピュータの部屋各種解説コーナーCGファイル概説

(2) 決定的ブロック(Critical chunk)

決定的ブロックはイメージを正しく表示するのに必要なデータを含むブロックで、IHDRブロック、PLTEブロック、IDATブロック、IENDブロックの4種類があります。 このうち、PLTEブロック以外は全てのPNGファイルに必ず存在します。

1) IHDRブロック(Image header chunk)

オフセット内容(バイト数)
0データ長(4)
固定値13
4ブロックタイプ(4)
固定値IHDR(49484452H)
8イメージの横幅(4)
ピクセル単位
12イメージの高さ(4)
ピクセル単位
16ビットの深さ(1)
整数(1,2,4,8,16)
17カラータイプ(1)
整数(0,2,3,4,6)
18圧縮方式(1)
固定値0
19フィルター方式(1)
固定値0
20インタレース方式(1)
整数(0,1)
21CRC(4)
CRCコード

イメージの大きさ等を表すヘッダ部分で、PNGファイル・シグネチャの直後に必須な決定的ブロックです。 このブロックには次のようなデータが含まれます。

(i) イメージの横幅(Width)

イメージの横幅をピクセル単位で表す4バイトの符号無し整数です。 値の有効範囲は1〜(231-1)です。

(ii) イメージの高さ(Height)

イメージの高さをピクセル単位で表す4バイトの符号無し整数です。 値の有効範囲は1〜(231-1)です。

(iii) ビットの深さ(Bit depth)

サンプルあたりのビット数またはパレットインデックスのビット数を表す1バイトの整数です。 有効な値は1、2、4、8、16のみですが、カラータイプによっては選択できない値もあります。

(iv) カラータイプ(Color type)

イメージのカラータイプを表す1バイトの整数で、次のような値の和(論理和)です。

カラータイプ許されるビットの深さ解釈
01,2,4,8,16グレースケール
28,16RGBカラー、パレット無し
31,2,4,8インデックスカラー、パレット有り
48,16グレースケール、アルファチャネル有り
68,16RGBカラー、アルファチャネル有り、パレット無し

有効なカラータイプの値と、その時許されるビットの深さの組み合わせは左表のとおりです。

アルファチャネル(alpha channel)は各ピクセルの透過度を表す値で、0が完全に透明であることを表し、(2ビットの深さ-1)が完全に不透明であることを表します。 これは8ビットまたは16ビットのグレースケールとRGBカラーのイメージに付加することができ、ビットの深さと同じビット長で、各サンプルの直後に保存されます。

(v) 圧縮方式(Compression method)

イメージデータの圧縮方式を表す1バイトの整数で、固定値0です。 圧縮方式0は32Kスライド辞書によるDeflate/Inflate圧縮で、現在のところはこの方式だけが定義されています。 この圧縮法はLZW圧縮と違って、完全にパテントフリーです。

(vi) フィルター方式(Filter method)

イメージデータに適用されたフィルター方式を表す1バイトの整数で、固定値0です。 フィルター方式0は次のような基本的な5種類のフィルタータイプを備えた適応フィルタリングで、現在のところはこの方式だけが定義されています。

フィルタリングは、圧縮効率を高めるために圧縮前にイメージデータに施される前処理で、イメージの変化に一定の傾向がある場合には有効です。 フィルタリングはスキャンラインごとに異なったフィルタータイプで行うことが可能で、スキャンラインの先頭にフィルタータイプバイトが付加されます。 フィルタータイプバイトはフィルタータイプ0の場合、つまりフィルタリングしない場合も付加されます。

フィルタリング・アルゴリズムはイメージのカラータイプやビットの深さによらず、ピクセルに対してではなくバイトに対して適用されます。 そしてイメージデータにアルファチャネルが付加されている場合は、アルファチャネルも同様にフィルタリングされます。

(vii) インタレース方式(Interlace method)

行番号サブセットサブセット
0
1
2
3
4
5
6
7
16462646
77777777
56565656
77777777
36463646
77777777
56565656
77777777
16462646
77777777
56565656
77777777
36463646
77777777
56565656
77777777







8
9
10
11
12
13
14
15
16462646
77777777
56565656
77777777
36463646
77777777
56565656
77777777
16462646
77777777
56565656
77777777
36463646
77777777
56565656
77777777







::::

イメージデータに適用されたインターレース方式を表す1バイトの整数で、次のような値が有効です。

インタレース方式0はインタレースしないことを表し、イメージデータのスキャンラインは左から右へ、スキャンラインは上から下へ順番に保存され、同じ順序で表示されます。 インタレース方式1は発案者Adam M. Costelloの名前に由来するAdam7方式で、次のような手順で保存され、同じ順序で表示されます。

  1. イメージ全体を左上隅を起点として8×8ピクセルのサブセットに分割する。
  2. サブセット中のピクセルに左図のような順番をつける。
  3. 各サブセット中の1番目のピクセルを、左上隅のサブセットから順に、左から右へ、上から下へと表示する。(パス1)
  4. 同様に、各サブセットの中の2番目から7番目までのピクセルを表示する。(パス2〜7)

各パスで表示されるピクセル数は、最初は少なくて次第に増えていき、最後のパス7では全体の半分の数となります。 このため、全体を表示する時間の約半分の時間で全体のイメージをぼんやりと表示することができます。

イメージの高さが8の倍数ではない場合、いくつかのパスは完全に空になります。 その場合、空のパスにはフィルタータイプバイトは付加されず、全く何も保存されないので注意が必要です。

2) PLTEブロック(Palette chunk)

オフセット内容(バイト数)
0データ長(4)
パレット数×3
4ブロックタイプ(4)
固定値PLTE(504C5445H)
8パレット0の赤の値(1)
0-255
9パレット0の緑の値(1)
0-255
10パレット0の青の値(1)
0-255
::
8+(データ長)CRC(4)
CRCコード

カラーマップの内容を保存したブロックで、IHDRブロックとIDATブロックの間に1つだけ存在します。 このブロックはカラータイプ3(インデックスカラー)の場合は必須であり、カラータイプ0と4(グレースケール)の場合は存在しません。 カラータイプ2と6(RGBダイレクトカラー)の場合はオプションで、存在する場合は、RGBカラーを直接表示できない場合のパレットとして利用されます。

カラーマップの各エントリーは赤(red)、緑(green)、青(blue)の値を表す1バイト符号無し整数3個からなり、ピクセル値0から順番に(データ長/3)個存在します。 RGB値の有効範囲は0〜255で、最大エントリー数は2(ビットの深さ)個です。

3) IDATブロック(Image data chunk)

オフセット内容(バイト数)
0データ長(4)
(231-1)以内
4ブロックタイプ(4)
固定値IDAT(49444154H)
8圧縮されたビットマップデータ
(231-1)バイト以内
8+(データ長)CRC(4)
CRCコード

ビットマップデータを保存したブロックで、PLTEブロックとIENDブロックの間に1個以上、連続して存在します。

ビットマップデータはIHDRブロックで指定されたインターレース方式の順に並べられ、指定されたフィルター方式でフィルタリングされ、指定された圧縮方式で圧縮された後、必要に応じて複数に分割して複数のIDATブロックに保存されます。 圧縮後のビットマップデータが最大データ長(231-1)バイト以内ならば1個のIDATブロックに保存することも可能ですが、処理プログラムのバッファサイズ等を考慮し、8〜64KB程度の大きさの複数のブロックに分けて保存するのが普通です。

現在の唯一の圧縮方式であるDeflate/Inflate圧縮では、圧縮後のデータは1つのzlibデータストリームになりますが、これをどこで分割してもかまいません。 GIFやTIFFではブロックごとに圧縮しますが、PNGでは圧縮した後に分割しますので注意が必要です。

4) IENDブロック(Image trailer chunk)

オフセット内容(バイト数)
0データ長(4)
固定値0
4ブロックタイプ(4)
固定値IEND(49454E44H)
8CRC(4)
CRCコード

PNGファイルの終了を表すブロックで、ファイルの最後に1つだけ存在します。 このブロックのデータ長は0で、ブロックデータは存在しません。