PNGファイル・シグネチャ |
---|
IHDRブロック |
PLTEブロック (オプション) |
付随的ブロック (オプション) |
: |
IDATブロック |
: |
IENDブロック |
2001年4月現在、PNGはVersion1.1のドラフト版仕様書が公表されていますが、ここでは1996年10月に公表されたVersion1.0に基づいて説明します。
PNGはファイル識別のためのPNGファイル・シグネチャと、それに続く複数のブロック(Chunk)から構成されています。
ブロックには必須のものと付随的なものとがあり、それらがある程度決まった順序で並んでいて、GIFと同様、基本的に順編成となっています。
オフセット | 内容(バイト数) |
---|---|
0 | データ長(4) ブロックデータのバイト数 |
4 | ブロックタイプ(4) ブロックタイプを表すコード |
8 | ブロックデータ(データ長) 各種のデータ |
8+(データ長) | CRC(4) CRCコード |
各ブロックは次のような4つの部分からなっています。 なおマルチバイトの数値領域はネットワークバイトオーダー、つまり最上位バイトから順番に保存されるビッグエンディアン方式で保存されます。
ブロックデータのバイト数を表す4バイトの符号無し整数です。 ブロックタイプとCRCのバイト数を含まず、値の有効範囲は0〜(231-1)です。 最大値が(231-1)となっているのは、4バイトの符号無し整数をサポートしていないシステムのことを考慮したためです。
ブロックの種類を表す4バイトの文字コードです。 使用可能な文字はアルファベットの大文字と小文字(A-Z, a-z)ですが、仕様書ではASCIIコードに特定せず、値に制限のあるバイナリーコードとして扱うことを求めています。 ASCIIコードの場合、各バイトの5ビット目は大文字と小文字を区別するビットとなりますが、その性質を利用してブロックの属性を表す属性ビット(property bit)として使用されます。
ブロックごとに異なる(データ長)バイトのデータで、0バイトも可能です。 0バイトの場合、この領域は存在しません。
CRC(巡回冗長検査)用の4バイトの符号無し整数です。 ブロックタイプとブロックデータに対して計算され、ブロックデータが無い場合も常に存在します。 CRCはISO-3309やITU-V42で提議された標準CRC方式によって計算されます。 使用されるCRC多項式は、
という複雑なものですが、実際には計算済みテーブルを参照して処理します。
オフセット | 内容(バイト数) |
---|---|
0 | PNGファイル・シグネチャ(8) PNG識別子 (固定値89504E470D0A1A0AH) |
PNGファイルを識別するためのヘッダ部分で、ファイルの先頭に1つだけ存在します。 内容は固定値「[89H]PNG[CR][LF][SUB][LF](89504E470D0A1A0AH)」で、これはテキストファイル等がPNGファイルと誤認されてしまう可能性を極力少なくするために考えられたものです。 またGIFと違ってバージョン番号を表す部分がありませんが、これはフォーマットをバージョン独立にするために、故意に設計されたものです。