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識別部(2) 本体部
図1: PNGファイルの構造

(1) PNG識別部

PNG識別部は、PNGであることを識別するコードで、常に次の8バイトからなります。

0x890x500x4E0x470x0D0x0A0x1A0x0A
図2: PNG認識部

Perl文ふうに書くと、"\x89PNG\r\n\x1a\n" という文字列になります。

(2) 本体部

本体部は、複数のチャンクと呼ばれるブロックからなります。1つのチャンクは、次のような構造を持ちます。

データ長
4バイト
名称
4バイト
データ
(データ長に示すバイト数)
CRC
4バイト
図3: 1つのチャンクの構造

データ長: データ長は、名称の後に続くデータの長さを示します。

名称: チャンクの名前です。

データ: データ長に示されたバイト数のデータが、ここにあります。

CRC: データが劣化していないかどうかをここで確かめることができます。

基本チャンク

基本チャンクは、IHDR PLTE IDAT IEND の4つです。

IHDR: イメージ・ヘッダのチャンクです。

イメージの幅
4バイト
イメージの高さ
4バイト
ビットの深さ
1バイト
カラー・タイプ
1バイト
圧縮方式
1バイト
フィルター方式
1バイト
インタレース方式
1バイト
図4: IHDRのデータ部分の構造

PLTE: パレットのチャンクです。

赤 (0-255)
1バイト
緑 (0-255)
1バイト
青 (0-255)
1バイト
図5: 1つのパレット・エントリの構造

IDAT: イメージ・データのチャンクです。

IEND: イメージ・テイラー(終端)のチャンクです。

補助チャンク

(1) PLTEより前に来るチャンク(PLTEがないならIDATより前に来るチャンク)

cHRM: 基本色度と白色点

白色点x
4バイト
白色点y
4バイト
x
4バイト
y
4バイト
x
4バイト
y
4バイト
x
4バイト
y
4バイト

gAMA: イメージ・ガンマ

イメージ・ガンマ
4バイト

sBIT: 重要ビット数

グレイの重要ビット数
1バイト
赤の重要ビット数
1バイト
緑の重要ビット数
1バイト
青の重要ビット数
1バイト
PLTE上の
赤の重要ビット数
1バイト
PLTE上の
緑の重要ビット数
1バイト
PLTE上の
青の重要ビット数
1バイト
グレイの重要ビット数
1バイト
アルファの重要ビット数
1バイト
赤の重要ビット数
1バイト
緑の重要ビット数
1バイト
青の重要ビット数
1バイト
アルファの重要ビット数
1バイト

sRGB: 標準RGB色空間

レンダリング目的
1バイト

iCCP: 埋込ICCプロフィール

プロフィール名
1-79バイト
ヌル分離符号
1バイト
圧縮方式
1バイト
圧縮プロフィール
必要バイト数

(2) IDATより前に来るチャンク(またはPLTEとIDATとの間に来るチャンク)

bKGD: 背景色

パレット・インデックス
1バイト
グレイ
2バイト

2バイト

2バイト

2バイト

hIST: イメージ・ヒストグラム

tRNS: 透過

グレイ
2バイト

2バイト

2バイト

2バイト

pHYs: 物理的画素寸法

X軸方向画素数
(単位あたり)
4バイト
Y軸方向画素数
(単位あたり)
4バイト
単位指示子

1バイト

sPLT: 示唆パレット

パレット名
1-79バイト
ヌル分離符号
1バイト
サンプル精度
1バイト
RGB+アルファ+頻度の配列
6バイトまたは10バイトの倍数

1 または 2バイト

1 または 2バイト

1 または 2バイト
アルファ
1 または 2バイト
頻度
2バイト

(3) どこにあってもよいチャンク

tIME: イメージ最終更新時刻


(西暦)
2バイト

(1-12)
1バイト

(1-31)
1バイト

(0-23)
1バイト

(0-59)
1バイト

(0-60)
1バイト

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より前に来るチャンク

oFFs: イメージ・オフセット

pCAL: 画素値の較正

sCAL: イメージの物理寸法

(2) どこにあってもよいチャンク

gIFg: GIFグラフィック制御拡張

gIFt: GIFプレーン・テキスト拡張

gIFx: GIF応用拡張

fRAc: フラクタル・イメージ・パラメータ

参考サイト

  • 仕様書
    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式画像カウンタ(桜月氏)