Float on the flow

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

オーバーサンプリング

ふと思いついて、オーバーサンプリングしてみたところ、
ベクター描画とほぼ同一の品質のビットマップを得ることができた。

            //4倍オーバーサンプリング
            var bd_4x:BitmapData = new BitmapData(800, 400);
            matrix.scale(4.0, 4.0);
            bd_4x.draw(sp, matrix, null, null, null, true);
            var bmp4:Bitmap = new Bitmap(bd_4x, PixelSnapping.AUTO, true);
            bmp4.scaleX = 0.25;
            bmp4.scaleY = 0.25;
            this.addChild(bmp4);

左上段がオリジナル(ベクター)、右中段が上記コードによる表示結果。


最終的には、必要なサイズのビットマップデータをByteArrayにして
サーバに送りたいので、Bitmapをscaleした結果を再度BitmapDataとして
取得する必要がありそうだけど、それはまた別途ということで。



全ソースはこちら。

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

    public class BitmapTest extends Sprite{
        
        public function BitmapTest() {
            stage.quality = StageQuality.BEST;
            //stage.quality = StageQuality.HIGH;
            //stage.quality = StageQuality.LOW;
            //stage.quality = StageQuality.MEDIUM;
            
            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;
            
            //シャープネスをかけてみる
            var bd_sharp:BitmapData = new BitmapData(200, 100);
            var sharpness_matrix:Array = [0, -1, 0,
                               -1, 5, -1,
                                0, -1, 0];
            var sharpness_filter:ConvolutionFilter = new ConvolutionFilter(3, 3, sharpness_matrix);
            var rect:Rectangle = new Rectangle(0, 0, 200, 100);
            var point:Point = new Point(0, 0);
            bd_sharp.draw(sp, matrix, null, null, null, true);
            bd_sharp.applyFilter(myBitmapData, rect, point, sharpness_filter);
            var bmp3:Bitmap = new Bitmap(bd_sharp, PixelSnapping.AUTO, true);
            this.addChild(bmp3);
            bmp3.x = 200
            bmp3.y = 0;

            //4倍オーバーサンプリング
            var bd_4x:BitmapData = new BitmapData(800, 400);
            matrix.scale(4.0, 4.0);
            bd_4x.draw(sp, matrix, null, null, null, true);
            var bmp4:Bitmap = new Bitmap(bd_4x, PixelSnapping.AUTO, true);
            bmp4.scaleX = 0.25;
            bmp4.scaleY = 0.25;
            this.addChild(bmp4);
            bmp4.x = 200;
            bmp4.y = 100;
        }
    }
}