2008年2月25日(7月17日修正) 戻る
APNGの仕様を惰性で適当に翻訳しました。 翻訳対象は2007年9月24日の版です。 原本はMozillaWiki/APNG_Specificationにあります。
APNGはPNGを拡張した仕様なので、完全なフォーマットを知るにはPNGの仕様も知っておく必要があります。 PNG仕様の参考になるサイト(2008年2月25日アクセス)
APNGを見るためにはFirefox3.0以降、Opera9.5~12.16が必要です。 Firefoxは全てのAPNGに対応しているわけではないようです。 詳細はBugzilla[Bug 411628]に登録されています。
一応、flashでAPNG画像を表示するサンプルも作ってみました。
APNG画像を作成するツール「APNGfromCSV」を作成しました。 機能は少ないですが、単純なアニメーションやアイコンを作成する場合なら使えるかもしれません。
以下、仕様の日本語訳を載せておきます。
From MozillaWiki
APNG 1.0
Original Authors:
APNGは[PNG][pngspec]フォーマットの拡張である。 これは普及しているシンプルなアニメーション画像の[GIF][gifspec]フォーマットに取って代わることを目的に作られた。 APNGはGIFにはない24bitイメージや8bitの透明色を扱うことができる。 APNGはMNGの簡潔な代替案である。 APNGはインターネットで一般的に使用されるアニメーション画像に適した仕様を規定する。
APNGはPNGへの後方互換がある。 PNGデコーダーはAPNG仕様のチャンクを無視して静止画を表示する。
「デフォルト画像」は標準の「IDAT」チャンクに記述される。 APNGに対応していないデコーダーが表示する画像である。
「キャンバス」は各フレームが表示される出力デバイスの領域である。 キャンバスの内容はデコーダーにとって有効である必要は無い。 PNG仕様により、背景の指定が無く「bKGD」チャンクがあれば「bKGD」の色で塗りつぶされる。
「出力バッファ」はピクセルの配列であり、PNGの「IHDR」チャンクの幅と高さでサイズが決まる。 概念的には、各フレームはキャンバスに描画する前に出力バッファ上に作成する。 出力バッファの内容はデコーダーにとって有効である。 出力バッファの角はキャンバスの角にマッピングされる。
「完全に透過な黒」とはRGBとアルファ値の全てが0の状態を指す。
チャンクの説明で使用される値について、 「unsigned int」は32bit符号なし整数であり、ネットワーク上のバイトオーダーで値は0から(2^31)-1に制限される。 「unsigned short」は16bit符号なし整数であり、ネットワーク上のバイトオーダーで値の範囲は0から(2^16)-1である。 「byte」は8bit符号なし整数であり、0から(2^8)-1である。
APNGはイメージ全体を読み込む前に、すでに読み込んであるフレームを順番に描画するようにデザインされている。 この方法だと実際にアニメーションが始まるまで気付かないエラーも有り得る。 デコーダーがエラーを発見した場合、以降のフレームを全て破棄し、アニメーションを止め、 デフォルト画像の表示に戻ることを強く推奨する。 デコーダーがアニメーションを始める前にエラーに気付いた場合、デフォルト画像を表示しなければならない。 それが妥当ならば、ユーザーにエラーメッセージを表示する。
APNGのデータ構造の並びはただのPNGと同様である。PNGの仕様も参照。 3種類のチャンクを追加することでアニメーションのフレームデータを規定する。
APNGと識別するには「IDAT」チャンクの前に「acTL」チャンクが存在しなければならない。 「acTL」チャンクの構造は後で述べる。
概念的には、再生するたびに出力バッファは「完全に透過な黒」で初期化しなければならない。 初期化は「IHDR」チャンクで幅と高さを指定された矩形を完全に塗りつぶす。
デフォルト画像をアニメーションに含める場合、「IDAT」チャンクの前に1つ「fcTL」チャンクを置く。 「fcTL」チャンクの中でデフォルト画像がアニメーションの1フレーム目であることを指定する。 そうしなかった場合、デフォルト画像はアニメーションに含まれない。
以降のフレームは「fdAT」チャンクの中にエンコードしておく。 「fdAT」チャンクはシーケンス番号から始まっていること以外は「IDAT」と同様の構造である。 各フレームの場所とレンダリング情報は「fcTL」チャンクに格納する。 「fdAT」チャンクと「fcTL」チャンクの完全な構造は後で述べる。
アニメーション全体の境界は「IHDR」チャンクの幅と高さで決まる。 デフォルト画像がアニメーションに含まれているかは関係ない。 デフォルト画像以降のフレームで描画しない範囲がある場合、 完全な透明色で適切にパディングしなければならない。
それぞれのフレームは何度再生しても完全に一致する。 これはアプリケーションが各フレームをキャッシュするための仕様である。
「fcTL」チャンクと「fdAT」チャンクは4byteのシーケンス番号を持つ。 2種類のチャンクはシーケンスを共有する。 これにはAPNGのシーケンスエラーを確認し、ついでにエラー情報を収集する狙いがある。 PNGの仕様では補助チャンクの順序に制限は無い。
最初の「fcTL」チャンクはシーケンス番号が0でなければならない。 以降の「fcTL」チャンクと「fdAT」チャンクにおいて、シーケンス番号の欠番や重複があってはならない。
下の表は2フレーム以上で2つ以上の「fdAT」チャンクを持つ場合のシーケンス番号について表している。
1フレーム目がデフォルト画像の場合、
Sequence number | Chunk |
---|---|
(none) | `acTL` |
0 | `fcTL` 1フレーム目を指定 |
(none) | `IDAT` 1フレーム目で使う画像 / デフォルト画像 |
1 | `fcTL` 2フレーム目を指定 |
2 | `fdAT` 2フレーム目で使う画像のデータ1 |
3 | `fdAT` 2フレーム目で使う画像のデータ2 |
... | ... |
デフォルト画像をアニメーションで使わない場合
Sequence number | Chunk |
---|---|
(none) | `acTL` |
(none) | `IDAT` デフォルト画像 |
0 | `fcTL` 1フレーム目を指定 |
1 | `fdAT` 1フレーム目で使う画像のデータ1 |
2 | `fdAT` 1フレーム目で使う画像のデータ2 |
... | ... |
デコーダーは順番を守らないAPNGチャンクをエラーとして扱う。 APNG対応のPNGエディターはシーケンス番号を正しく修正すべきである。
「acTL」チャンクはPNG仕様の定義では補助チャンクである。 それは正当なPNGの構造を守った上で、最初の「IDAT」チャンクの前に存在しなければならない。
「acTL」チャンクの内容は、
index | 項目 | 型 | 説明 |
---|---|---|---|
0 | num_frames | unsigned int | フレーム数 |
4 | num_plays | unsigned int | APNGのループ回数。0を指定すると無限ループ。 |
「num_frames」はアニメーションのトータルフレーム数を表す。 これは「fcTL」チャンクの数と一致しなければならない。 「num_frames」に0を指定してはならない。 1フレームのみのAPNGには1を指定する。 この値が実際のフレーム数と異なる場合、エラーとして扱う。
「num_plays」はアニメーションが何回再生すべきかを表す。 0が指定された場合、永久に再生を続ける。 0以外が指定された場合、指定された回数を再生し、最後のフレームになったらアニメーションを停止する。
「fcTL」チャンクはPNG仕様の定義では補助チャンクである。 対象フレームの「IDAT」チャンクまたは「fdAT」チャンクの前に存在しなければならない。 具体的には、
それぞれのフレームに1つの「fcTL」チャンクが必要である。
フォーマットは以下の通り、
index | 項目 | 型 | 説明 |
---|---|---|---|
0 | sequence_number | unsigned int | アニメーションチャンクのシーケンス番号、0から始まる |
4 | width | unsigned int | 後に続くフレームの幅 |
8 | height | unsigned int | 後に続くフレームの高さ |
12 | x_offset | unsigned int | 後に続くフレームを描画するx座標 |
16 | y_offset | unsigned int | 後に続くフレームを描画するy座標 |
20 | delay_num | unsigned short | フレーム遅延の分子 |
22 | delay_den | unsigned short | フレーム遅延の分母 |
24 | dispose_op | byte | フレームを描画した後にフレーム領域を廃棄するか? |
25 | blend_op | byte | フレーム描画方法のタイプ |
フレームはx_offset、y_offset、width、heightで定義された領域に描画する。 オフセットが負の値になってはならない。 領域は正の値でなけらばならない。 描画領域はデフォルト画像からはみ出てはならない。
フレーム領域の制限は以下の通り、
`x_offset` >= 0
`y_offset` >= 0
`width` > 0
`height` > 0
`x_offset` + `width` <= `IHDR` width
`y_offset` + `height` <= `IHDR` height
「delay_num」と「delay_den」で対象のフレームを何秒遅らせて表示するかを指定できる。 分母(delay_den)に0を指定した場合、100として扱う。 その場合、「delay_num」は1/100秒の遅延となる。 分子(delay_num)が0の場合、デコーダーは次のフレームをできる限り早く描画する。 だが、「できる限り早く」をどう表示するかはビューアの仕様で制限しても良い。 (訳注 : "viewers may impose a reasonable lower bound" ⇒ 例えばビューアの仕様で「できる限り早く」を「5ミリ秒以内」みたいに制限してしまっても良いという意味?)
フレームのタイミングはデコードするタイミングと表示のタイミングの両方から独立していなければならない。 これはデコーダーの実装によらず同じ速さでアニメーションを表示するためである。
「dispose_op」は遅延が終わった後、次のフレームをレンダリングする前に出力バッファをどうするか指定する。
「dispose_op」として有効な値は以下の通り、
値 | 項目 | 説明 |
---|---|---|
0 | APNG_DISPOSE_OP_NONE | 次のフレームを描画する前に消去しない。出力バッファをそのまま使用する。 |
1 | APNG_DISPOSE_OP_BACKGROUND | 次のフレームを描画する前に、出力バッファのフレーム領域を「完全に透過な黒」で塗りつぶす。 |
2 | APNG_DISPOSE_OP_PREVIOUS | 次のフレームを描画する前に、出力バッファのフレーム領域をこのフレームに入る前の状態に戻す。 |
最初の「fcTL」チャンクの「dispose_op」でAPNG_DISPOSE_OP_PREVIOUSが指定された場合、 APNG_DISPOSE_OP_BACKGROUNDのときと同様に扱う。
「blend_op」は現在の出力バッファにアルファブレンドで合成するか、完全に出力バッファを入れ替えるかを指定する。
「blend_op」として有効な値は以下の通り、
値 | 項目 |
---|---|
0 | APNG_BLEND_OP_SOURCE |
1 | APNG_BLEND_OP_OVER |
「blend_op」がAPNG_BLEND_OP_SOURCEの場合、アルファ値を含めた全ての要素をフレームの出力バッファ領域に上書きする。 「blend_op」がAPNG_BLEND_OP_OVERの場合、書き込むデータのアルファ値を使って出力バッファに合成する。 このとき、PNG仕様[PNG-1.2]の「アルファチャンネル処理」に書いてある通り上書き処理をする。 サンプルコードの2つ目の項目を参照。
2つのブレンドモードは最初のフレームでは同じ結果になることに注意。 これはどちらのブレンドモードでも出力バッファが初期化されているためだ。
デフォルト画像に対する「fcTL」チャンクには、以下の制限がある。
まず注意すべきなのは、どのように再生する場合でも出力バッファは「完全に透過な黒」で初期化するということである。 これはどのように再生する場合でもアニメーションが一致することを保障する。 デコーダーは、結果が一致すると保証できる場合には初期化ステップを省略することができる。 例えば、デフォルト画像がアニメーションに含まれており、 「blend_op」にAPNG_BLEND_OP_SOURCEが設定されている場合は初期化は不要だ。 この場合、出力バッファが完全に上書きされるからだ。
「fdAT」チャンクは「IDAT」チャンクと同じ目的のデータである。 「fdAT」チャンクはシーケンス番号から始まっていること以外は「IDAT」と同様の構造である。
各フレームには少なくとも1つの「fdAT」チャンクが存在しなくてはならない。 フレーム内にある「fdAT」チャンクの全てのデータフィールドを連結すると、圧縮された画像データになる。 画像データストリームを解凍すると、PNG画像の完全なピクセルデータになる。 解凍されたデータストリームは、スキャンライン毎の開始点のフィルターバイトを含み、解凍された「IDAT」チャンクのデータと同様である。 それはデフォルト画像と同様に、「IDAT」チャンクと同じビット深度、カラータイプ、圧縮方式、フィルター方式、インタレース方式ともしあるならばパレットを利用する。
フォーマットは以下の通り、
index | 項目 | 型 | 説明 |
---|---|---|---|
0 | sequence_number | unsigned int | アニメーションチャンクのシーケンス番号、0から始まる |
4 | frame_data | X bytes | このフレームのデータ |
それぞれのフレームはファイルの最初の「IDAT」チャンク以前にある必須チャンクまたは補助チャンクの指定を継承する。 ただし、幅と高さは「fcTL」チャンクの値を使用する。
「pHYs」チャンクが存在する場合、APNGの「x_offset」と「y_offset」はデフォルト画像と同様にスケーリングしなければならない。 概念的には、このようなスケーリングは出力バッファをキャンバスにマッピングするときに発生する。
翻訳は割愛。
サンプル画像はAPNG実装ページ(http://littlesvr.ca/apng/)にあります。
オープンソースのエンコーダーはalpha4以降のMozillaにあります。
MozillaのAPNGエンコーダーを組み込んだオープンソースのアプリケーションはこちらにあります。 http://littlesvr.ca/apng/apngedit.html
[pngspec]: http://www.w3.org/TR/PNG/ "Portable Network Graphics (PNG) Specification (Second Edition)"
[pngext]: http://pmt.sourceforge.net/specs/png-1.2-pdg.html "Extensions to the PNG Specification, Version 1.2.0"
[gifspec]: http://www.w3.org/Graphics/GIF/spec-gif89a.txt "Graphics Interchange Format 89a"
[pngproject]: http://www.animatedpng.com "APNG Project - official Site"