オーバーサンプリング
ふと思いついて、オーバーサンプリングしてみたところ、
ベクター描画とほぼ同一の品質のビットマップを得ることができた。
//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; } } }