AS3で誤差拡散法

Filed under AS3



AS3で画像処理。

「誤差拡散法」という手法でハーフトーン処理を行ってます。

以下、ソースです。

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.MouseEvent;
	import flash.filters.ColorMatrixFilter;
	import flash.geom.Point;

	[SWF(backgroundColor="#000000")]
	public class Main extends Sprite
	{
		[Embed(source='image.jpg')]
		private var img:Class;
		private var bmp:Bitmap;
		private var source:BitmapData;
		private var dest:BitmapData;
		private var count:int = 0;

		public function Main()
		{
			stage.quality = StageQuality.HIGH;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			stage.frameRate = 40;

			// ソース画像を作成
			source = (new img as Bitmap).bitmapData;
			source.applyFilter(source, source.rect, new Point, new ColorMatrixFilter([1/3,1/3,1/3,0,0,1/3,1/3,1/3,0,0,1/3,1/3,1/3,0,0,0,0,0,1,0]));
			var w:Number = source.width;
			var h:Number = source.height;

			// 誤差を保存するバッファ
			var buff:Array = [];
			for(var i:int=0 ; i<w ; i++)
			{
				buff[i] = [];
				for(var j:int=0 ; j<h ; j++) buff[i][j]=(source.getPixel(i,j) & 0xFF) as Number;
			}

			// 処理画像
			dest = source.clone();

			// 計算
			for(j=0 ; j<h ; j++)
			{
				for(i=0 ; i<w ; i++)
				{
					var err:Number;
					if(buff[i][j] > 127)
					{
						dest.setPixel(i,j,0xffffff);
						err = buff[i][j] - 255;
					}
					else
					{
						dest.setPixel(i,j,0x000000);
						err = buff[i][j];
					}

					// 誤差を拡散
					if(i+1 < w) buff[i+1][j] += err*7/16;
					if(j+1 < h) buff[i][j+1] += err*5/16;
					if(i+1 < w && j+1 < h) buff[i+1][j+1] += err/16;
					if(i-1 >= 0 && j+1 < h) buff[i-1][j+1] += err*3/16;
				}
			}

			// 画像を表示
			bmp = addChild(new Bitmap(dest)) as Bitmap;
			bmp.x = bmp.y = 50;
			count = 0;
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}

		// 元画像と処理後画像を切り替える
		private function onClick(e:MouseEvent):void
		{
			count ++;
			if(count %2 == 0) bmp.bitmapData = dest;
			else bmp.bitmapData = source;
		}
	}
}

Post a Comment

Your email is never published nor shared.