イナヅマTVログ

キャプチャしたByteArrayをBitmapDataへ変換し再利用

| 0件のコメント

画面をキャプチャし JPEG / PNG 変換した画像を Flash 内部で再利用するの巻。

AS3, 画面をキャプチャして画像生成(JPG,PNG)では、ByteArrayをString変換し、サーバーのPHPに送りecho されたデータをLoadしているけど、Flashだけでどうにかなんないかと考えてみました。
サーバーへデータを送る時の手順は次のようになります。

  1. キャプチャしたい矩形をgetBoundsで取得
  2. 矩形サイズのBitmapDataをつくりキャプチャ元を複製
  3. corelibの JPGEncoder, PNGEncoder でByteArrayへエンコード
  4. ByteArrayをBase64でString型へ
  5. サーバーへPOST送信


APIリファレンスを見ていると Loader.loadBytes というメソッドを発見。

ByteArray オブジェクトに保管されているバイナリデータからロードします。

説明を見ているだけではナニができるかは良くわかりませんが、ByteArrayのバイナリデータをどうにかできるみたいです。

  1. キャプチャしたい矩形をgetBoundsで取得
  2. 矩形サイズのBitmapDataをつくりキャプチャ元を複製
  3. corelibの JPGEncoder, PNGEncoder でByteArrayへエンコード
  4. ByteArrayをLoader.loadBytes(ByteArray)
  5. 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 すると覚えておくことにします。

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください