TITLE:Flash SWF 上の JPEG の扱い #contents * はじめに [#uccd699a] - Flash SWF バイナリ内の(非可逆圧縮)画像は JPEG 形式で格納される。 -- SWF フォーマットの詳細はこちら > [[Flash/SWF/format]] - JPEG を格納するフォーマットは4種類あり、以下のタグで区別する -- DefineBitsJPEG(6), DefineBitsJPEG2(21), DefineBitsJPEG3(35), DefineBitsJPEG4(90) * タグ別JPEG構造 [#ae8da8f1] - DefineBitsJPEG は以下の2択 -- JPEG のうち圧縮テーブル情報のセグメント(DQT,DHT)を、別タグ(JPEGTables)のブロックに分離する。 --- 尚、JPEGTables は SWF ファイル内に1つしか置けないので、圧縮テーブル情報のセグメントを抜いた DefineBitsJPEG(2,3 も同様)は全て一つの JPEGTables を(共通で)参照する事になる。 -- JPEG 形式がそのまま入る (仕様的には微妙な使い方) - DefineBitsJPEG2,3 は以下の二択。[http://diary.awm.jp/~yoya/?2008020&to=20080203#200802031 参考] -- DefineBitsJPEG2,3 タグ内の、前半に圧縮テーブル情報を持ってきて、後半にそれ以外のセグメントを置き、各々 SOI EOI で囲む。 --- この後者の方法を取った場合、SOI, EOI マーカーが2つずつ含まれる、妙な JPEG に見え る。(前者の場合の SOI, EOI の扱いは未調査) -- JPEG のうち圧縮テーブルのセグメントを、別タグ(JPEGTables)のブロックに入れて、それを参照する。(DefineBitsJPEG と同じで、仕様的には微妙) - DefineBitsJPEG4 の JPEG 構造は不明。恐らくは DefineBitsJPEG2,3 と同様と思われる。 ** 付加的なデータ [#l60ed7bf] - DefineBitsJPEG3 は更に、alpha channel(透明度)データが後ろに付く。 -- 透明度のデータを zlib 圧縮して埋めこまれる。 -- マスクデータを指定してスプライト表示のように使う事が多い。([http://diary.awm.jp/~yoya/?20080213#200802132 参考]) - DefineBitsJPEG4 は更に、スムージングフィルタ用の設定値が 2byte で付加される -- デブロッキングフィルタに渡すパラメータを 2byte で埋め込む -- それ以外は DefineBitsJPEG3 と同じと思われる ** その他 [#a7f4b721] - 特殊に見える JPEG の説明はこちら。↓ (本家のサイトはアクセスできなくなっているので、cache 参考の事) -- ming について --- http://auicon.freeownhost.com/pc/dev/ming/jpeg.html ([http://www.awm.jp/~yoya/cache/auicon.freeownhost.com/pc/dev/ming/jpeg.html cache]) --- [http://www.awm.jp/~yoya/cache/auicon.freeownhost.com/pc/dev/ming/jpeg.c.diff jpeg.c.diff の cache] * 歴史的経緯の推測 [#p3a9338b] 根拠は殆どないけど、勝手に推理。 - JPEG の圧縮テーブル部分は(ほぼ?)固定なので、それ用のタグを作って共通で持つようにすればデータ量減るよね。 > JPEGTable(圧縮テーブル) + DefineBitsJPEG(圧縮された画像データ) -- どちらも JPEG フォーマットの一部なので、SOI, EOI でくくっておこう - JPEGTable と DefineBitsJPEG を合成して1つのタグにしちゃっていいんじゃないか > DefineBitsJPEG2(圧縮テーブル+画像データ、情報量的には JPEG フォーマットと同等) -- JPEGTable と DefineBitsJPEG はどちらも SOI, EOI でくくるので、結果的に SOI, EOI が 2つずつになる。しかも一般的に JPEG フォーマットは、圧縮テーブルは真ん中らへんに配置されるので、並びが異なる。 - DefineBitsJPEG, DefineBitsJPEG2 に JPEG 画像をそのまま入れてみよう -- でも、Flash Player の実装系の中には JPEGTable の SOI,EOI と DefineBitsJPEG の SOI,EOI の両方がある前提で作られてるものが… (主に携帯のFlashプレイヤー) - しゃーない、JPEG フォーマットの頭に SOI,EOI を余分につけていいよ? でないと困るよね? って事? * 調べ始めたきっかけ [#l84881e4] - http://pc11.2ch.net/test/read.cgi/swf/1172599208/277-376 [#tdef6cc3] 375 :Now_loading...774KB:2007/06/15(金) 02:45:13 ID:t9sozzWd >>345 >>374 JPEGを差し替えるだけならこんな感じ。 1)とりあえずベースとなるswfを作る。 2)DefineBitsJPEG2を探してJPEGデータを差し替える。 3)差し替えたDefineBitsJPEG2のRECORDHEADER内のLengthを書き換える。 4)SWF File HeaderのFileLengthを書き換える。 用語やフォーマットは flash_fileformat_specification.pdf を参照。 * 備考 [#u9fde506] - SWFspec v8 以降、DefineBitsJPEG2,3(,4) は JPEG に限らず(PNG等の)ファイル画像を生のまま入れられる。 - DefineBitsLossless は独自画像フォーマットで、DefineBitsJPEG は JPEG ファイルをほぼそのままなので、DefineBitsJPEG2,3(,4) を選択したと思われるが、タグ名については仕様を作った人も後悔してるらしい。 * 参考 [#ref] - http://www.m2osw.com/en/swf_alexref.html#tag_definebitsjpeg * 関連 [#rel] - JPEG フォーマット ([[JPEG]]) - SWF Editor PHP extension ([[swfed]]) - [[SWF フォーマット>Flash/SWF/format]] |