ActionScript3でJPEG
2009.10.18 日曜日
Flashで生成したBitmapDataをJPEG操作する際のメモ。
エンコード(BitmapData→JPEG)は、「as3corelib」のJPGEncoderクラスでもいいですが、FLASH Player 10 以上であれば、Vector型配列に最適化されている「Optimized JPEG Encoder」の方が処理速度が速いのでお勧め。デコード(JPEG→BitmapData)は、ちょっと面倒ですがLoaderクラスを使います。
PNGのエンコードには「as3corelib」を使うのが簡単だと思います。デコードはJPEGと同じ方法で問題ありません。
下記サンプルコードは、起動時にノイズ画像を生成して描画、それをJPEGにエンコード後、デコードして描画しています。Encode()の第2引数が圧縮率で100が最も画像がきれい(低圧縮)になります。Decode()は第1引数のByteArrayを第2引数のBitmapDataに描画します。
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.ByteArray;
public class Main extends MovieClip {
//初期設定
public function Main():void {
//画像(ノイズ)を生成
var src:BitmapData = new BitmapData(300, 300);
src.noise(0);
//画像をJPEGにエンコード後、デコード
var result:BitmapData = new BitmapData(300, 300)
Decode(Encode(src, 0), result);
//元画像を表示
var SampleA:Bitmap = new Bitmap(src);
this.addChild(SampleA);
//JPEG圧縮後の画像を表示
var SampleB:Bitmap = new Bitmap(result);
this.addChild(SampleB);
SampleB.x = SampleA.width;
}
//エンコード
private function Encode(_bmp:BitmapData, _quality:uint = 50):ByteArray {
//エンコーダーの設定
var encoder:JPEGEncoder = new JPEGEncoder(_quality);
var data:ByteArray = new ByteArray();
data = encoder.encode(_bmp);
//バイト配列を返す
return (data);
}
//デコード
private function Decode(_data:ByteArray, _bmp:BitmapData):void {
//バイト配列の読み込み
var loader:Loader = new Loader();
loader.loadBytes(_data);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, Loaded);
//読み込みが完了した場合
function Loaded(e:Event):void {
//描画
_bmp.draw(loader);
}
}
}
}
http://www.inazumatv.com/contents/archives/3573
Posted by tmdf|ActionScript