Float on the flow

とあるエンジニアのブログ。「ゆったり・しっかり」がモットー。

ActionScript3でベクタ→ビットマップ変換

最近、Flash/Flex/ActionScript3に注目しています。


しかし、どこから手をつけようかと思ってしまったり。
Box2DFlashAS3とか、Papervision3Dとか、いろいろと
面白そうなネタはころがっているけれど。


そこで、まずは手始めにミニ画像編集ツールでも作ってみようかと
思い立ちました。個人的に使いたいシーンがあるので。


でもって、その前段として
 ・AS3でベクターを描画
 ・それをビットマップに変換する
という機能の実現方法を調べて、実装。。。
というところで、予想外に詰まってしまいました。


元のベクター画像はくっきりと表示されているのに、(画像上段)
ビットマップ化すると画像がぼやけてしまうのですよ。(画像中段)
スムージングをOFFにしたら今度はジャギーだらけになるし。(画像下段)

なにかうまい解決策はあるんですかねぇ…


テストコードは下記のとおりです。

package  {
    import flash.display.*;
    import flash.filters.ColorMatrixFilter;
    import flash.text.*;
    import flash.geom.*;
    import flash.events.*;

    public class BitmapTest extends Sprite{
        
        public function BitmapTest() {
            var sp:Sprite = new Sprite();
            sp.graphics.beginFill(0xFFFFFF);
            sp.graphics.drawRect(0, 0, 200, 100);
            
            sp.graphics.lineStyle(1, 0x0099FF);
            sp.graphics.moveTo(0, 0);
            sp.graphics.lineTo(200, 100);
            
            sp.graphics.endFill();
            
            sp.graphics.beginFill(0xFF0000);
            sp.graphics.drawRect(20, 5, 1, 1);
            sp.graphics.endFill();
            
            this.addChild(sp);
            
            var matrix:Matrix = new Matrix();
            matrix.scale(1.0, 1.0);
            
            var myBitmapData:BitmapData = new BitmapData(200, 100);
            myBitmapData.draw(sp, matrix, null, null, null, true);

            //スムージングするとジャギーはましになるが、ぼやけた感じになる。
            var bmp:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true);
            this.addChild(bmp);
            bmp.y = 100;

            //スムージングしないとジャギジャギ。
            var bmp2:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, false); 
            this.addChild(bmp2);
            bmp2.y = 200;
        }
    }
}