SWF Shape デフォルメ機能

Flash SWF ファイル内のベクター(Shape)情報から細かい描画を省略する実験です。
100KB 制限の Flash Lite だと 1byte でも削りたいですし。別に Lite でなくても転送量は極力減らしたいですから。

結果を先に言うと失敗しました。戦略がよくないと思われます。

戦略

  • カーブで一定より短いものは直線にする
  • 線分リストの先頭の先端から一定距離内の線分を1つの線分にまとめる
  • 先端から一定距離以上になったら、その次の線分から同じ事を繰り返す

プログラム

pure PHP でバイナリから描画データを切り出して再構築してます。
アホですね。はい。

Flash

適当な SWF を利用。何処から持ってきたかは忘れました。

awm.jp:~/IO_SWF% swfdump bloxorz.swf | grep "File size"
[HEADER]        File size: 3166474

文字の形に注目です。

実験0

実は、描画データを削らずに、ただ再構築しただけでも少しサイズが減ります。

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 0 > t-0.swf
awm.jp:~/IO_SWF% swfdump t-0.swf | grep "File size"
[HEADER]        File size: 3166369

100byte も変わりませんが。

実験1

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 100 > t-100.swf
awm.jp:~/IO_SWF% swfdump t-100.swf | grep "File size"
[HEADER]        File size: 3160652

形が崩れてますが何とか読めます。5822 byte削れました。

実験2

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 1000 > t-1000.swf
awm.jp:~/IO_SWF% swfdump t-1000.swf | grep "File size"
[HEADER]        File size: 3157203

小さい文字が消えてしまいました。
9271byte 削れましたが、これじゃダメです。

実験3

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 10000 > t-10000.swf
awm.jp:~/IO_SWF% swfdump t-10000.swf | grep "File size"
[HEADER]        File size: 3151985

もはや文字が全部見えなくなってます。サイズ以前に完璧NGです。

TODO

文字が消えるのは閾値の問題なので仕方ないとして、文字の崩れ方が不自然です。
線分の短い順に隣の(角度の似てる)線分に吸収させる方法で作り直してみます。