PNG (Portable Network Graphics) Specification, Version 1.2


Previous page
Next page
Table of contents

2. データ表現

この章では PNG ファイルで使われる基本的なデータ表現と同時にイメージデータに求められる表現について述べます。

2.1. 整数とバイトオーダー

1-byte 以上を必要とするすべての整数はネットワークバイトオーダー、つまり大きな意味をもったバイトが最初にきて、そして少ない意味を持ったバイトが大きさの意味の降順でなければなりません(2-byte 整数のなら MSB LSB、4-byte 整数なら B3 B2 B1 B0)。バイトの最高位のビット(値 128)は7番目のビットで、最低位のビット(値 1)は0番目のビットです。ほかの注意がなければ値は無符号です。有符号の表示が明示されている値は 2 の補数表記で表現されます。

ほかに規定がなければ、無符号の 4-byte 値に困難さがある言語に調整するため 4-byte の無符号整数は 0 から 231-1 までの範囲に制限されます。同様に -231 の値に困難さがある言語に調整するために 4-byte の有符号整数は -(231-1) から 231-1 までの範囲に制限されます。

論拠は:Byte order を参照してください。

2.2. カラー値

色はグレイスケールもしくは RGB (赤、緑、青)のサンプルデータで表現することができます。グレイスケールのデータは輝度を表現し、RGB のデータは( cHRM チャンクが存在するとき)校正された色の情報もしくは( cHRM チャンクが存在しないとき)校正されない装置依存の色を表現します。すべてのカラー値は(黒を意味する) 0 から最も強いサンプル深度の最大値までを範囲とします。与えられたサンプル深度の最大値は 2sampledepth-1 であり、2sampledepth ではないことに注意しましょう。

サンプル値は必ずしも光の強度に比例する必要はありません。gAMA チャンクがサンプル値と表示出力強度の関係を指定し、ビュアは適切な補正をすることを強く推奨されます。Gamma correction を参照してください。

PNG では直接サポートされないような精度(たとえば 5-bit/サンプルのトゥルーカラー)の元データはサポートされる次に大きなビット深度に拡大する必要があります。この拡大はデータの損失なしに元に戻すことができ、デコーダが対処しなくてはならないような場合の数を減らします。エンコーダへの勧告は:Sample depth scaling 、デコーダへの勧告は:Sample depth rescaling を参照してください

2.3. イメージレイアウト

概念的には、PNG イメージはスキャンラインごとにピクセルが左から右に現れ、上から下にスキャンラインが現れる長方形のピクセルの配列です。(プログレッシブ表示のために、データが実際には異なる順番で転送されることがあります。Interlaced data order を参照してください。)それぞれのピクセルのサイズはイメージデータのサンプルあたりのビット数であるビット深度によって決定されます。

3種類のピクセルがサポートされます:

グレイスケールとトゥルーカラーのピクセルは次の章で説明されるαサンプルを随意に含めることができます。

ピクセルは常にピクセルの間にあまりの bit がないようにスキャンラインに詰め込まれます。1-byte より小さいピクセルは byte 境界を跨ぐことはありません。それらは、左側のピクセルがバイトの高位ビットに、右側のが低位ビットに詰め込まれます。すべての場合で詰め込みが単純で効率のよいものになるように許されるビット深度とピクセル形式は制限されます。

PNG では倍数サンプルのピクセルは 8- と 16-bit のサンプルのみ認められています。ひとつのピクセルで倍数のサンプルは 1-byte に詰めることができないためです。すべての 16-bit のサンプルはネットワークバイトオーダー(MSB が最初)によって保存されます。

スキャンラインはつねにバイト境界から始まります。ピクセルが 8-bit よりすくなく、スキャンラインの幅がバイトあたりのピクセル数によって割り切れないとき、それぞれのスキャンラインの最後のバイトの低位ビットはあけられます。それらあけられたビットの内容は指定されません。

すべてのスキャンラインの始まりには付加的な「フィルター形式」バイトが加えられます(Filtering を参照してください)。フィルター形式バイトはイメージデータの一部だとは考えられませんが、圧縮過程に送られるデータストリームには含まれます。

2.4. αチャンネル

ピクセルごとの透明度の情報を表現するαチャンネルはグレイスケールとトゥルーカラーの PNG イメージに含めることができます。

α値 0 は完全な透明を表現し、値が 2bitdepth-1 は完全に不透明なピクセルを表現します。中間の値は合成イメージを生成するために背景のイメージと合成することのできる部分的に透明なピクセルを示します。(したがって、αは実際にはピクセルの不透明の度合いです。しかし、多くの人がαを不透明度情報ではなく、透明度情報を提供するものであると言っているのでここではその習慣を続けます)。

αチャンネルはサンプルあたり 8- または 16-bit のどちらかのイメージに含めることができますが、サンプルあたり 8-bit 未満のイメージには含めることはできません。αサンプルはイメージのサンプルに使われているのと同じビット深度で表現されます。それぞれのピクセルのαサンプルはピクセルのグレイスケールもしくは RGB のサンプルの直後に保存されます。

ピクセルのために保存されたカラー値はそのピクセルに割り当てられたα値によって影響を受けません。この規則はときとして、「関連づけられない」もしくは「事前に積算されない」αと呼ばれます。(ほかの一般的な手法はαの割合を事前にサンプル値に積算して保存するというものです。事実上このようなイメージはすでに黒い背景に合成されてしまっています。PNG は事前に積算されるαを使いません)。

透明度の制御は完全なαチャンネルに記憶装置を費やさずとも実現できます。インデックスカラーイメージでは、α値はパレットエントリそれぞれに定義することができます。グレイスケールやトゥルーカラーイメージではひとつのピクセル値が「透明色」として認めることができます。それらの手法は tRNS 補助チャンク形式によって制御されます。

αチャンネルや tRNS チャンネルが存在しないのなら、すべてのイメージ中のピクセルのαチャンネルは完全な不透明として扱われます。

ビュアは透明度の制御を部分的にサポートできますし、全くサポートしないことも可能です。

論拠は: Non-premultiplied alpha、エンコーダへの勧告は:Alpha channel creation、デコーダへの勧告は:Alpha channel processing を参照してください。

2.5. フィルタリング

PNG はイメージデータを圧縮する前にフィルタリングすることができます。フィルタリングはデータの圧縮性を向上させることができます。フィルターの工程そのものはデータのサイズを減らすことはありません。すべての PNG のフィルターは完全に可逆です。

PNG はフィルタリングしないという "None" を含めていくつかの異なるフィルターアルゴリズムを定義しています。フィルターアルゴリズムは圧縮前のデータストリームのフィルターがなされたスキャンラインの前に置かれるフィルター形式バイトによってスキャンラインごとに指定されます。インテリジェントなエンコーダはスキャンラインごとにフィルターを切り替えることができます。使用するフィルターを選択する手法はエンコーダ次第です。

Filter Algorithms と、論拠は:Filtering を参照してください。

2.6. インターレースのデータ序列

PNG のイメージはプログレッシブ表示のためにインターレースされた順番で保存することができます。この特徴の目的はオンザフライで表示するときにイメージを「フェードイン」することです。インターレースは平均的にわずかにファイルサイズを膨張させますが、、利用者により迅速な意味のある表示を与えます。デコーダはインターレースのイメージを読み込める必要がありますが、じっさいにプログレッシブ表示を行う必要はないことに注意してください。

インターレース手法が 0 のとき、ピクセルは左から右へ連続して、スキャンラインは上から下へ連続して保存されます(no interlacing)。

インターレース手法が 1 はその作者 Adam M. Costello の名前から Adam7 で知られるイメージを7回のパスで構成するものです。それぞれのパスはイメージ中のピクセルのサブセットを伝送します。それぞれのピクセルが転送されるパスは以下の 8 x 8 のパターンを左上の端からイメージ全体に複製することで定義されます:

   1 6 4 6 2 6 4 6
   7 7 7 7 7 7 7 7
   5 6 5 6 5 6 5 6
   7 7 7 7 7 7 7 7
   3 6 4 6 3 6 4 6
   7 7 7 7 7 7 7 7
   5 6 5 6 5 6 5 6
   7 7 7 7 7 7 7 7

それぞれのパスには、選ばれたピクセルがスキャンライン中を左から右に転送され、選ばれたスキャンラインは上から下に連続します。たとえば、パス 2 はスキャンライン 0, 8, 16,... のピクセル 4, 12, 20,... を格納します(左上の端を 0,0 と番号づけて)。最後のパスはスキャンライン 1, 3, 5,... を格納します。

それぞれのパス中のデータは割り当てられた寸法を持つ完全なイメージであるかのように張り付けられます。たとえば、全部そろっているイメージが 16 x 16 ならば、パス 3 は4つのピクセルを持つ2つのスキャンラインを格納します。ピクセルが 8-bit 未満だったとき、それぞれのスキャンラインは整数バイトまで詰め物をする必要があります(Image layout を参照してください)。この切り刻まれたイメージにも通常の方法でフィルタリングがなされ、フィルター形式バイトがそれおぞれのスキャンラインの前に伝送されます(Filter Algorithms を参照してください)。伝送順序はパスに転送されたスキャンラインすべてが同数のピクセルを持つように定義されていることに注目してください。これはフィルターに関して適切なアプリケーションに必要なことです。

注意: イメージが5行未満であったり、5列未満であったりしたとき、いくつかのパスは完全に空になります。エンコーダやデコーダはこのような場合でも正確に扱う必要があります。とりわけ、フィルター形式バイトは空じゃないスキャンラインにのみ関連づけられ、空のパスにはフィルター形式バイトは存在しません。

論拠は:Interlacing、デコーダに対する勧告は:Progressive display を参照してください。

2.7. ガンマ補正

PNG のイメージは、gAMA チャンクを通して、イメージサンプルの望ましい出力に関連するべき関数を指定することができます。表示プログラムは、イメージの原作者が見ていたものとできる限り近く再現してイメージを表現するための方法として、この情報に加えて、それらの使う表示システムについての情報を使うことを強く推奨されます。あなたが、ガンマの問題に精通していないのなら、Gamma Tutorial を参照してください。

ガンマ補正はαチャンネルには適用されません。αサンプルはつねに完全な不透明さの線形な割合を表現しています。

高精度なアプリケーションでは、cHRM チャンクを通して、PNG イメージの RGB データの実際の色度を指定することができ、ガンマ補正が単独で提供されるときよりより精密なカラーマッチングができます。RGB データが sRGB 指定 span class=ref>[sRGB] に従うときは、 sRGB に示され、より精密な再現さえ可能となります。あるいは、iCCP チャンクは色空間の詳細を含む ICC プロフィール [ICC] を組み込むために使うことができます。あなたが、色の再現の問題に精通していないのなら、Color Tutorial を参照してください。

論拠は:Why gamma?、エンコーダへの勧告は:Encoder gamma handling、デコーダへの勧告は:Decoder gamma handling を参照してください。

2.8. テキスト文字列

PNG はイメージの説明や著作権表示などイメージに関連するテキストを保存することができます。キーワードはそれぞれのテキスト文字列がなにを表現しているのかを示すために使われます。

ISO/IEC 8859-1 (Latin-1) は、tEXtzTXt チャンクで使うことが推奨されている文字セットです [ISO/IEC-8859-1]。それは 7-bit ASCII の上位集合です。Latin-1 セット以外のキャラクタを運ぶ必要のあるときは、iTXt チャンクが代わりに使われるでしょう。

Latin-1 に定義されていない文字コードはプラットフォーム非依存の意味を持たないので、tEXtzTXt チャンクでは使うべきではありません。非 Latin-1 コードが PNG のテキスト文字列に現れるときは、プラットフォームやデコーダによって異なる解釈がされるでしょう。いくつかのシステムは Latin-1 のすべての文字ですら表示することができないかもしれませんが、多くの現代的なシステムなら可能です。

圧縮されたテキストを保存する準備もできてます。

論拠は:Text strings を参照してください。


Previous page
Next page
Table of contents