SWF

  • 元々は JPEG データ(非可逆圧縮)を格納するタグ
  • 妙なJPEG構造を調査した結果はこちら → Flash/JPEG
  • 転じて、JPEG, PNG, GIF を生のまま保存するタグ

(6) DefineBitsJPEG (公式には DefineBits)

  • JPEG データが image_data にそのまま入る
  • JPEG データから圧縮用テーブルだけ抜かれたデータが入る事もある
  • その場合、圧縮用テーブルは JPEGTables タグを参照する。
    +-------------------------------------------------------------+
    | tag & length |    length    |  image_id |     image_data    |
    |  6  ,  0x3f  |              |           |                   |
    +-------------------------------------------------------------+
    <-- 2 bytes --> <- 4 bytes -> <-2 bytes->  <-contents 残り全部->
                                  <------------------  length ---->
    

(8) JPEGTables

  • JPEG データの圧縮用テーブルだけ入る (SWF 中に1つのみ)
  • 圧縮用テーブルが入っていない DefineBitsJPEG から参照される。
    +---------------------------------------------------+
    | tag & length |    length    |  encoding_tables    |
    |  8     0x3f  |              |                     |
    +---------------------------------------------------+
    <-- 2 bytes --> <- 4 bytes ->
                                  <------ length ------>
    

(21) DefineBitsJPEG2

  • JPEG データの圧縮テーブルに関するセグメントが encoding_tables (又は、別の tag である JPEGTables の方)に、それ以外のセグメントが image_data に入る。
  • そのまま取り出しても JPEG ファイルにはならず、セグメントを並び替える必要がある。
  • 各々、SOI(Start of Image)、EOI(End of Image) マーカーでくくるので、SOI,EOI が2つある妙な JPEG に見える。 ** 参考1 -> http://diary.awm.jp/~yoya/?20080203#200802031 ** 参考2 -> http://diary.awm.jp/~yoya/?20080203#200802033 ** 参考3 -> http://mp.i-revo.jp/user.php/wrckyapk/entry/7225.html
  • JPEG データのセグメント構造については (Flash/JPEG)参考のこと。
    +-----------------------------------------+------------------------------+
    | tag & length |    length    |  image_id | encoding_tables | image_data |
    |  21 ,  0x3f  |              |           |                              |
    +------------------------------------------------------------------------+
    <-- 2 bytes --> <- 4 bytes  -> <-2 bytes->  <---    contents 残り全部  --->
                                   <---------------- length ---------------->
    

(35) DefineBitsJPEG3

  • DefineBitsJPEG2 のデータに alpha channel (透明度)データが加わったもの
  • これに画像のマスク値を乗せればスプライト的な表示が可能。
  • alpha channel は zlib 圧縮して格納。伸張すると画像左上の pixel から対応する順に透明度の値(1byte)が並んでいる。 ** 参考 -> http://diary.awm.jp/~yoya/?20080213#200802132
    +---------------------------------------------------------------
    | tag & length |    length    |  image_id | offset_to_alpha | ..
    |  35 ,  0x3f  |              |           |                 |
    +---------------------------------------------------------------
    <-- 2 bytes --> <-  4 bytes -> <-2 bytes-> <--  4 bytes -->
                                   <--- length (最後まで)  ---
     ---+------------------------------+-------------------+
     .. | encoding_tables | image_data |   alpha(zlib圧縮) |
     ---+------------------------------+-------------------+
         <--    offse_to_alpha      --> <-contents 残り全部->
    

(90) DefineBitsJPEG4

  • DefineBitsJPEG3 のデータに deblock_param (デブロッキングフィルタの値)データが加わったもの

deblock_param は 2 byte

+---------------------------------------------------------------
| tag & length |    length    |  image_id | offset_to_alpha | ..
|  90 ,  0x3f  |              |           |                 |
+---------------------------------------------------------------
<-- 2 bytes --> <-  4 bytes -> <-2 bytes-> <--  4 bytes -->
                               <--- length (最後まで)  ---
 ---+-------------+-----------------+------------+-------------------+
 .. |deblock_param| encoding_tables | image_data |   alpha(zlib圧縮) |
 ---+-------------+-----------------+------------+-------------------+
     <- 2 bytes ->                               <-contents 残り全部->
     <------------ offset_to_alpha ------------->

参考