2008/08/25

SWFの3276px問題 - 65535twips問題

ベクター形式(SWF)で出力していた画像をFlexアプリケーションでロードした際に、以下に記す問題に遭遇しました。
簡単にブラウザクラッシャーが作れてしまいます。
・・・まず、こんな大きいサイズの画像を出力しようって人は少ないでしょうね。
SVGじゃなくてSWFですし。

[問題]
幅、高さが3276ピクセル以上の画像をSWF出力し、ロードするとFlash Playerがフリーズするか落ちる。

[原因]
SWF出力対象の幅、高さが3276ピクセル以上になってはいけない。
SWFの読み書きでは、unsigned shortで値を扱っている部分があるため、3276ピクセル(65535twips)を超えると桁あふれしてしまう。

2の16乗 = 65536(twips) = 3276.8(px) * 20

[対処]
SWF出力前に画像を3276ピクセル以下に縮小して出力するようにした。

[補足]
・Flash MXではムービーの新規作成時の幅、高さの上限を2880ピクセル
としているため、壊れたSWFファイルを出力することができない。
・Flashでは扱えるビットマップの幅、高さの上限は2880ピクセルである。
・Adobe Illustratorで幅、高さ3276ピクセル以上の画像を作成し、SWFで書き出すと問題を簡単に再現できる。

0 件のコメント: