AS3のflash.utils.ByteArrayを使うとバイト単位の操作が可能になる、おかげてFlashでJPEG,PNGなどの画像生成もできる。
他にもzipアーカイブ解凍や音声なしflvも作成可能。
Adobe – Developer Center 2008-09-28の記事 Saving Flash graphics as image files at runtimeにソースファイル付きでサンプルがあったのでありがたく試してみる。
著者のClive GoodinsonはネットでComicが作れるPixton.comの制作に携わったgoodinson.comの人。
サンプルは入力したテキストごとMovieClipをキャプチャした後、JPGかPNGに変換して、サーバーのPHPにデータを送り
・再度読み込む
・ダウンロードする
・ブラウザの別ウインドウに表示する
が行えるようになっている。
サーバー側のPHPは単にデータを返すだけで、これで画像を生成していない。
画像生成処理まですべてFlash側でできることがスゴイ。
Diretorだとサードパーティーのextraを使わないといけないところ・・・
ByteArrayの他に以下のライブラリを使う。
Adobeの corelib。
dynamicflash.comの com.dynamicflash.util.Base64。
Base64
ActionScript 3.0 Base64 encoder/decoder にも少し解説が。
Base64作者のSteve WebsterさんはYahoo UKのWeb DeveloperでFoundation ActionScript 3.0 with Flash CS3 and Flex 著書の一人。
【手順】com.goodinson.snapshot.Snapshot.as
- キャプチャしたい矩形をgetBoundsで取得
- 矩形サイズのBitmapDataをつくりキャプチャ元を複製
- corelibの JPGEncoder, PNGEncoder でByteArrayへエンコード
- ByteArrayをBase64でString型へ
- サーバーへPOST送信
再読み込み用インスタンス loader を単純なMovieClipにしたので、
サンプルソースのSnapshot.as
options.loader.load(request);
を
var ldr:Loader = new Loader();
ldr.load(request);
options.loader.removeChildAt(0);
options.loader.addChild(ldr);
へ修正。
サンプルではloaderはリンケージでLoader Classのインスタンスになっている。
[swfobj src=”http://www.inazumatv.com/contents/wp-content/uploads/2008/10/snapshot-test-1.swf” alt=”FlashでJPG,PNG生成” width=”600″ height=”300″ id=”snapshot-test-1″ name=”snapshot-test-1″ allowfullscreen=”false” required_player_version=”9.0.124″]
AIRならサーバーなしで単体でできそう。。
update : 2008-12-28
添付PHPファイルは不正アクセスなどの対策などが全く施されていないので、そのままWebで使うのは危険ではないかと思う。
POSTされたデータをヘッダーを付けて返しているだけだけど、直接アクセス対策ぐらいはしておいた方が良さそうだ。
update : 2009-06-19
Flash Player 10 がターゲットで JPEG エンコードだと Alchemy 版 jpegencoder を使う方が処理が早い。
Alchemy, jpegencoder – 画面をキャプチャしてJPEGで保存
flash.net.FileReference
を使えば PHP を経由しなくてもダウンロードが可能になる。
as3-corelib はgithubへ移動しています。
https://github.com/mikechambers/as3corelib
ピンバック: イナヅマtvログ » Alchemy, jpegencoder – 画面をキャプチャしてJPEGで保存
ピンバック: イナヅマtvログ » キャプチャしたByteArrayをBitmapDataへ変換し再利用
ピンバック: 日々のメモ張 » [AS3] PNG画像の生成
ピンバック: イナヅマtvログ 2010 « イナヅマTVログ