SWF Shape デフォルメ機能
Flash SWF ファイル内のベクター(Shape)情報から細かい描画を省略する実験です。
100KB 制限の Flash Lite だと 1byte でも削りたいですし。別に Lite でなくても転送量は極力減らしたいですから。
結果を先に言うと失敗しました。戦略がよくないと思われます。
戦略
- カーブで一定より短いものは直線にする
- 線分リストの先頭の先端から一定距離内の線分を1つの線分にまとめる
- 先端から一定距離以上になったら、その次の線分から同じ事を繰り返す
プログラム
- http://openpear.org/package/IO_SWF
- http://svn.openpear.org/IO_SWF/trunk/IO/SWF/Shape.php
- deforme function
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
文字が消えるのは閾値の問題なので仕方ないとして、文字の崩れ方が不自然です。
線分の短い順に隣の(角度の似てる)線分に吸収させる方法で作り直してみます。