PNGについて
目次
PNGファイルの構造 ├ 識別部 └ 本体部 ├ 標準チャンク │ ├ 基本チャンク │ │ └ IHDR PLTE IDAT IEND │ └ 補助チャンク │ ├ cHRM gAMA sBIT sRGB iCCP │ ├ bKGD hIST tRNS pHYs sPLT │ └ tIME tEXt zTXt iTXt └ 付加チャンク └ 公式登録チャンク ├ oFFs pCAL sCAL └ gIFg gIFt gIFx fRAc 参考サイトPNGファイルの構造
PNGファイルは、PNG識別部と本体部とからなっています。
図1: PNGファイルの構造
(1) PNG識別部 (2) 本体部 (1) PNG識別部
PNG識別部は、PNGであることを識別するコードで、常に次の8バイトからなります。
図2: PNG認識部
0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A Perl文ふうに書くと、"\x89PNG\r\n\x1a\n" という文字列になります。
(2) 本体部
本体部は、複数のチャンクと呼ばれるブロックからなります。1つのチャンクは、次のような構造を持ちます。
図3: 1つのチャンクの構造
データ長
4バイト名称
4バイトデータ
(データ長に示すバイト数)CRC
4バイトデータ長: データ長は、名称の後に続くデータの長さを示します。
名称: チャンクの名前です。
データ: データ長に示されたバイト数のデータが、ここにあります。
CRC: データが劣化していないかどうかをここで確かめることができます。
基本チャンク
基本チャンクは、IHDR PLTE IDAT IEND の4つです。
IHDR: イメージ・ヘッダのチャンクです。
このチャンクは一番最初に必ず存在します。ここで、イメージの幅、高さ、ビットの深さ、カラー・タイプ、圧縮方式、フィルター方式、インタレース方式を決めます。
図4: IHDRのデータ部分の構造
イメージの幅
4バイトイメージの高さ
4バイトビットの深さ
1バイトカラー・タイプ
1バイト圧縮方式
1バイトフィルター方式
1バイトインタレース方式
1バイトカラー・タイプ:
0 = グレイスケール
2 = RGB
3 = パレット
4 = グレイスケール+アルファ
6 = RGB+アルファ
圧縮方式:
0 = 現在はこの方式のみ定義されている
フィルター方式:
0 = 現在はこの方式のみ定義されている
インタレース方式:
0 = 非インタレース
1 = Adam7でインタレース
PLTE: パレットのチャンクです。
このチャンクはIHDRのカラー・タイプがパレット(3)の場合には必ず存在します。
このチャンクはIHDRのカラー・タイプがRGB(2または6)の場合には存在することもあります。
このチャンクはIHDRのカラー・タイプがグレイスケール(0または4)の場合には存在しません。
このチャンクは256個までのパレット・エントリを持つことができます。
図5: 1つのパレット・エントリの構造
赤 (0-255)
1バイト緑 (0-255)
1バイト青 (0-255)
1バイトIDAT: イメージ・データのチャンクです。
ここに実際のイメージ・データを含みます。
IEND: イメージ・テイラー(終端)のチャンクです。
このチャンクは一番最後に必ず存在します。
補助チャンク
(1) PLTEより前に来るチャンク(PLTEがないならIDATより前に来るチャンク)
cHRM: 基本色度と白色点
1931 CIE x,y 色度を100000倍した各値をデータとします。
白色点x
4バイト白色点y
4バイト赤x
4バイト赤y
4バイト緑x
4バイト緑y
4バイト青x
4バイト青y
4バイト(注) IE5ではcHRMの結果が反映されない (ただしMNGプラグインでは反映される)
gAMA: イメージ・ガンマ
ガンマを100000倍した値をデータとします。
イメージ・ガンマ
4バイトsBIT: 重要ビット数
IHDRのカラー・タイプが 0 (グレイスケール) の場合
グレイの重要ビット数
1バイトIHDRのカラー・タイプが 2 (RGB) の場合
赤の重要ビット数
1バイト緑の重要ビット数
1バイト青の重要ビット数
1バイトIHDRのカラー・タイプが 3 (パレット) の場合
PLTE上の
赤の重要ビット数
1バイトPLTE上の
緑の重要ビット数
1バイトPLTE上の
青の重要ビット数
1バイトIHDRのカラー・タイプが 4 (グレイスケール+アルファ) の場合
グレイの重要ビット数
1バイトアルファの重要ビット数
1バイトIHDRのカラー・タイプが 6 (RGB+アルファ) の場合
赤の重要ビット数
1バイト緑の重要ビット数
1バイト青の重要ビット数
1バイトアルファの重要ビット数
1バイトsRGB: 標準RGB色空間
レンダリング目的
1バイトレンダリング目的:
0 = 知覚
1 = 相対色
2 = 彩度
3 = 絶対色
iCCP: 埋込ICCプロフィール
ICC (The International Color Consortium) で定義されたプロフィールをデータとします。
プロフィール名
1-79バイトヌル分離符号
1バイト圧縮方式
1バイト圧縮プロフィール
必要バイト数(2) IDATより前に来るチャンク(またはPLTEとIDATとの間に来るチャンク)
bKGD: 背景色
IHDRのカラー・タイプがパレット (3) の場合
パレット・インデックス
1バイトIHDRのカラー・タイプがグレイスケール (0 または 4) の場合
グレイ
2バイトIHDRのカラー・タイプがRBG (2 または 6) の場合
赤
2バイト緑
2バイト青
2バイトhIST: イメージ・ヒストグラム
hISTチャンクは、カラー・パレットのそれぞれの色のおよその使用頻度を与えます。
したがって、PLTEチャンクがあるときのみ hISTチャンクは存在可能です。
hISTチャンクは、パレット・インデックスに対応した 2バイトの整数の配列からなります。
tRNS: 透過
IHDRのカラー・タイプがアルファ・チャンネルを含む(4 と 6) ときには、アルファ値によって不透明度が決定されますので、tRNSチャンクは不要(禁止)です。
IDHRのカラー・タイプがグレイスケール (0) の場合
グレイ
2バイトIDHRのカラー・タイプがRGB (2) の場合
赤
2バイト緑
2バイト青
2バイトIDHRのカラー・タイプがパレット (3) の場合、パレット・インデックスに対応した アルファ値(1バイト) の配列となります。
(注) IE5ではパレット以外の透過は反映されないし、パレットではアルファ値が255(ff)以外は全透過となる (MNGプラグインではパレット以外の透過も反映される)
pHYs: 物理的画素寸法
X軸方向画素数
(単位あたり)
4バイトY軸方向画素数
(単位あたり)
4バイト単位指示子
1バイト単位指示子:
0 = 未知
1 = メートル
sPLT: 示唆パレット
sPLTは、表示装置がすべての色を表示できないときに減色パレットを示唆するために使われます。
パレット名
1-79バイトヌル分離符号
1バイトサンプル精度
1バイトRGB+アルファ+頻度の配列
6バイトまたは10バイトの倍数「RGB+アルファ+頻度の配列」の1つの要素は次の構造です。
赤
1 または 2バイト緑
1 または 2バイト青
1 または 2バイトアルファ
1 または 2バイト頻度
2バイトtIME: イメージ最終更新時刻
年
(西暦)
2バイト月
(1-12)
1バイト日
(1-31)
1バイト時
(0-23)
1バイト分
(0-59)
1バイト秒
(0-60)
1バイト(注) 秒の60は閏秒をしめす。
tEXt: テキスト・データ
キーワード
1-79バイトヌル分離符号
1バイトテキスト
必要バイト数zTXt: 圧縮テキスト・データ
キーワード
1-79バイトヌル分離符号
1バイト圧縮方式
1バイト圧縮テキスト
必要バイト数iTXt: 国際テキスト・データ
キーワード
1-79バイトヌル分離符号
1バイト圧縮フラグ
1バイト圧縮方式
1バイト言語タグ
0 以上のバイトヌル分離符号
1バイト翻訳キーワード
(UTF-8)
0 以上のバイトヌル分離符号
1バイトテキスト
(UTF-8)
0以上のバイト付加チャンク
以下のチャンクが公式に登録されています。
(1) IDATより前に来るチャンクsCAL: イメージの物理寸法
参考サイト
仕様書
PNG仕様書1.2(日本語訳)
PNG仕様書1.0(日本語訳)
PNG仕様書1.2の拡張(英語)
MNG仕様書1.0(英語)
PNG/MNGホームページ
PNG HOME SITE (Greg Roelofs氏)
MNG HOME SITE (Greg Roelofs氏)
CGIでも使えるPNG式画像カウンタ(桜月氏)