Python + SWFバイナリ解析 : ビットマップ画像用 DefineShape タグ解析完了
SWFバイナリ解析にて、表示サイズの異なるビットマップ画像を差し替える際に必要な DefineShape タグの解析が完了。以後、フラプリにて利用予定。
サンプル
(1)
画像差し替え前の元の swf を以下とします。swf 内にはシンボルを一つ配置し、そのシンボル内の座標(0, 0)位置に、幅 40px 高さ 42 px の画像を配置しています。
(2)
DefineShape の内容を変更せずに画像を差し替えると以下のような表示となります。差し替えた画像表示サイズは 幅 56px 高さ 52 px ですが、表示が切れてしまっています。
(3)
DefineShape の内容を適切に変更すると以下のようになります。
解析手順 概要
まず以下に公開されている記事の「4.シェイプデータを更新」の項を参考に、Bounding box の表示サイズを修正しました。
http://reindrop.wordpress.com/2008/08/28/flash解析jpeg差し替え編/
この Bounding box で設定した値が swf 内で width, height として認識されるようです。
Bounding box 修正後どうするかはネット上にほぼ記事が見つからない状況のため、以下の swf 仕様書とにらめっこして解析する必要あります。
・本家
SWF File Format Specification Version 10
・有志の方による本家翻訳サイト
Flash SWF Spec
「シェイプ」の項と「基本的なデータ型」の項が参考となります。
解析内容
サンプル(1)の swf 内 ビットマップ画像用 DefineShape タグを解析した結果を出力した結果が以下となります。
---- DefineShape ---- -- FillStyleArray -- fillStyleCount 1 - FillStyle - fillStyleType 0x41 bitmapId 1 - MatrixRecord - hasScale 1 nScaleBits 22 scaleX 1310720 scaleY 1310720 hasRotate 0 nTranslateBits 0 translateX 0 translateY 0 -- LineStyleArray -- lineStyleCount 0 - numFillBits 1 numLineBits 0 - -- ShapeRecord -- - StyleChangeRecord - stateNewStyles 0 stateLineStyle 0 stateFillStyle1 1 stateFillStyle0 0 stateMoveTo 0 fillStyle1 1 - StraightEdgeRecord - numBits 9 generalLineFlag 0 vertLineFlag 0 deltaX 800 - StraightEdgeRecord - numBits 9 generalLineFlag 0 vertLineFlag 1 deltaY 840 - StraightEdgeRecord - numBits 9 generalLineFlag 0 vertLineFlag 0 deltaX -800 - StraightEdgeRecord - numBits 9 generalLineFlag 0 vertLineFlag 1 deltaY -840
800 と 840 という値をそれぞれ 20 で割ると 40, 42 という幅、高さを示している事がわかります。各 deltaX, deltaY とそれに関わる numBits の値を修正し、以下のようにすることで、サンプル(3)用 シェイプ表示領域となります。
… - StraightEdgeRecord - numBits 10 generalLineFlag 0 vertLineFlag 0 deltaX 1120 - StraightEdgeRecord - numBits 10 generalLineFlag 0 vertLineFlag 1 deltaY 1040 - StraightEdgeRecord - numBits 10 generalLineFlag 0 vertLineFlag 0 deltaX -1120 - StraightEdgeRecord - numBits 10 generalLineFlag 0 vertLineFlag 1 deltaY -1040
その他 参考
DefineShape タグの解析処理では、ビット演算処理が今まで私が行ってきた力技では難しいと感じたため、GREE Engineers' Blog「SWFバイナリ編集のススメ」を記述されている方の、バイナリ操作用 Bit.php を参考にさせていただきました。
http://openpear.org/package/IO_Bit/src/trunk/IO/Bit.php
[ FLASH ] [ tips ] [ update ] 投稿者 siratama : 2011年04月03日 19:53