影付きエンボス処理

matsu45122009-08-07


エフェクト処理に影エンボス処理を追加
こんな感じ
ソースは右クリック


Sobelフィルターで微分値を取り、それを法線として影を付ける。


ソース

//影を付けたエンボス処理
private function shade_embos():void
{
	if(target_bmpData == null) return;
	bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
	
	var sobel1:Array=[
		 1, 0,-1,
		 2, 0,-2,
		 1, 0,-1];
	var sobel2:Array=[
		 1, 2, 1,
		 0, 0, 0,
		-1,-2,-1];
		
	var x:int,y:int;
	var xx:int,yy:int;
	var dx:Number, dy:Number, dz:Number;
	var c1:int, c2:int;
	var rrx:int, ggx:int, bbx:int;
	var rry:int, ggy:int, bby:int;
	var rr:int, gg:int, bb:int;
	var col:Color = new Color(), ncol:Color = new Color();
	var sobel:Array;
	var sadr:int;
	var gray:int;
	var x1:int, y1:int, x2:int, y2:int;

	x1 = 0;
	y1 = 0;
	x2 = bmpData2.width-1;
	y2 = bmpData2.height-1;

	adjustLightSourse();
	for(y = y1; y <= y2; y++) {
		for(x = x1; x <= x2; x++) {
			rrx = ggx = bbx = 0;
			rry = ggy = bby = 0;
			sadr = 0;
			
			//Sobelフィルターを使って微分値を求める
			for(yy = 0; yy < 3; yy++) {
				for(xx = 0; xx < 3; xx++) {
					col.color = target_bmpData.getPixel(x+xx-1,y+yy-1);	//画像上の画素情報を取得
					rr=col.r;
					gg=col.g;
					bb=col.b;
					rrx+= gray*sobel1[sadr];
					rry+= gray*sobel2[sadr];
					sadr++;
				}
			}
			dx=Number(rrx);
			dy=Number(rry);
			dz = 16.0;
			col.color = target_bmpData.getPixel(x+xx-1,y+yy-1);	//画像上の画素情報を取得
			
			//影を付ける
			rr=lighting(col.r,dx,dy,dz,(x-x1),Number(y-y1),0.0);
			gg=lighting(col.g,dx,dy,dz,Number(x-x1),Number(y-y1),0.0);
			bb=lighting(col.b,dx,dy,dz,Number(x-x1),Number(y-y1),0.0);
			col.r = rr;
			col.g = gg;
			col.b = bb;
			bmpData2.setPixel(x,y,col.color);	// 画像に値をセットする
		}
	}
	
	view.bitmapData = target_bmpData = bmpData2;
	myImage.width = view.width = myImage.width;
	myImage.height = view.height = myImage.height;
}