画面をキャプチャし JPEG / PNG 変換した画像を Flash 内部で再利用するの巻。
AS3, 画面をキャプチャして画像生成(JPG,PNG)では、ByteArrayをString変換し、サーバーのPHPに送りecho
されたデータをLoadしているけど、Flashだけでどうにかなんないかと考えてみました。
サーバーへデータを送る時の手順は次のようになります。
- キャプチャしたい矩形をgetBoundsで取得
- 矩形サイズのBitmapDataをつくりキャプチャ元を複製
- corelibの JPGEncoder, PNGEncoder でByteArrayへエンコード
- ByteArrayをBase64でString型へ
- サーバーへPOST送信
APIリファレンスを見ていると Loader.loadBytes
というメソッドを発見。
ByteArray オブジェクトに保管されているバイナリデータからロードします。
説明を見ているだけではナニができるかは良くわかりませんが、ByteArrayのバイナリデータをどうにかできるみたいです。
- キャプチャしたい矩形をgetBoundsで取得
- 矩形サイズのBitmapDataをつくりキャプチャ元を複製
- corelibの JPGEncoder, PNGEncoder でByteArrayへエンコード
- ByteArrayを
Loader.loadBytes(ByteArray)
BitmapData.draw(Loader)
コードは以下のようにしました。
var rect:Rectangle = object.getBounds(this); var bitmapData:BitmapData = new BitmapData(rect.width, rect.height); bitmapData.draw(object); var ba:ByteArray = bitmapData.getPixels(bitmapData.rect); var baout:ByteArray = PNGEncoder.encode(bitmapData); var loader:Loader = new Loader(); loader.loadBytes(baout); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void{ var bd:BitmapData = new BitmapData(loader.width, loader.height); bd.draw(loader); } ); |
サーバー側のプログラムを使わなくとも再利用できるようになりました。
保存もAlchemy, jpegencoder – 画面をキャプチャしてJPEGで保存のように flash.net.FileReference
を使えば保存もFlashで行えます。
カメラを使ったりドロー系のプロジェクトに使えそうです。
Loader
は外部ファイルを利用する時に使うものだと決めつけていたのがだめでした、データを読み込むのに使うためのクラスのようです。
まだ BitmapData.draw
の仕組みがすっきりきていませんが、Load して draw すると覚えておくことにします。