« アルファチャンネルの圧縮方法 | メイン | アルファチャンネル付きJPEG »

2008年05月04日

吉里吉里 ムービー拡張日誌2:: JPEG の中にアルファチャンネルデータを詰め込む

    

JPEG には、アプリケーションデータセグメントと言うものがあり、ここにいろいろとデータを入れられ、その種類を示すマーカーが 0 ~ 15 番までの16種類使える。
ただ、JFIF が 0 番を、Exif が 1 番を、Adobe の何かが 14 番を使うようだ。
同じマーカー番号を使っても、その内容で見分けられるようにしてあれば、問題はないが分けていたほうが扱いやすいのは確か ( 実際、Exif は かぶってもわかるように"Exif\0\0"と言う識別子が入っている )。
と言うことで、2 番 ~ 13 番か 15 番を使うのが良さそう。
特に理由はないけど、7番 ( マーカーコード 0xFFE7 ) を使うことにした ( 最初は 5 番にしようかと思ったけど、マーカーコードの 0xE5 はなんとなく避けたいから止めた ) 。

マーカー内のデータサイズは 2 バイトなので、格納するデータサイズが 16 ビット であらわせる数を超える場合、複数に分けないといけない。
そのため、マーカーのデータサイズ以外に、実際のデータサイズを入れておいたほうが便利だろうと言うことで、データサイズは入れる。
後、"Alpha\0"などの識別子も入れておいたほうが良さそう。
圧縮データの格納方式も入れる必要がある。
展開後のサイズは、画像の幅 x 高さでわかるので入れない。

最初のセグメント
marker ( 0xFFE7 ) ( 2 byte )
segment size ( 2 byte )
"Alpha\0" ( 6 byte )
type ( 4 byte )
compressed data size ( 4 byte )
compressed data ……

16 ビットであらわせるより大きい場合の、2個目以降のセグメント
marker ( 0xFFE7 ) ( 2 byte )
segment size ( 2 byte )
"Alpha\0" ( 6 byte )
compressed data ……

こんな感じかな。
もし、拡張したくなったら type の種類を変えて、それ以降の意味が変わるようにするか。

type はとりあえず、以下の4つあればいいかな。
"RAW " : 無圧縮
"ZLIB" : Zlib圧縮
"JPEG" : JPEG圧縮
"JPG4" : 画像のサイズを 1/4 にして、JPEG圧縮したもの

以上のような形でアルファ付きJPEGを保存することにした。
このマーカーを扱えない ( 現状全ての ) アプリで見ると、アルファのない普通の JPEG ファイルとして見れるはず。
マーカーを無視しないアプリがあったら開けないだろうけど。


関連記事・続きの記事

アルファチャンネル付きJPEG
JPEG の中にアルファチャンネルデータを詰め込む で書いた形で、アルファチャン... [続きを読む]


投稿者 Takenori : 2008年05月04日 22:47



コメント

アルファのセグメントについてですが、セグメント内に文字列を指定する場合には\0を付加するのが通例なのでtypeは5バイト以上の方がいいかもしれません。

私はJPEG-LSに可能性を感じているのですが、この記事のアイデアと組み合わせればアルファ付き画像に対応できますね。
まあ、HD-Photo(JPEG XR)と性能を比較しないといけないんですが……。

投稿者 ぼーず [TypeKey Profile Page] : 2009年03月12日 18:19


comments powered by Disqus
Total : Today : Yesterday : なかのひと