イラスト調変換

matsu45122009-08-11


エフェクト処理の中にイラスト調変換を実装
こんな感じ


閾値をいくつか設定して、その値ごとに色を決めて、
色の細かい変化なくしています。


ソース

//イラスト調変換
private function illustration_trans(ol:int, gammaint:int):void
{
	
	if(target_bmpData == null) return;
	bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
	
	const GAP:int = 10;

	var x:int, y:int;
	var xx:int, yy:int;
	var gamma:Number, a:Number;
	var rrx:int, ggx:int, bbx:int;
	var rry:int, ggy:int, bby:int;
	var rrr:int, ggg:int, bbb:int;
	var rr:int, gg:int, bb:int, gray:int;
	var rate:int;
	var res1:int, res2:int, res:int;
	var th1:int, th2:int, th3:int;
	var col:Color = new Color();
	var sadr:int;
	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 x1:int, y1:int, x2:int, y2:int;

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

	gamma = Number(gammaint) / 100.0;
	gamma = 1.0 / gamma;
	//閾値設定
	a = 128.0 / 255.0;
	th1 = int(Math.pow(a, gamma) * 255.0);
	a = 96.0 / 255.0;
	th2 = int(Math.pow(a, gamma) * 255.0);
	a = 64.0 / 255.0;
	th3 = int(Math.pow(a, gamma) * 255.0);
	
	for(y = y1; y <= y2; y++) {
		for(x = x1; x <= x2; x++) {
			rrx = ggx = bbx = 0;
			rry = ggy = bby = 0;
			sadr = 0;
			
			//縦方向、横方向のエッジ抽出
			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 += rr * sobel1[sadr];
					rry += rr * sobel2[sadr];
					ggx += gg * sobel1[sadr];
					ggy += gg * sobel2[sadr];
					bbx += bb * sobel1[sadr];
					bby += bb * sobel2[sadr];
					sadr++;
				}
			}
			
			rrr = int(Math.sqrt(Number(rrx*rrx + rry*rry)) / 8.0);
			ggg=int(Math.sqrt(Number(ggx*ggx + ggy*ggy)) / 8.0);
			bbb=int(Math.sqrt(Number(bbx*bbx + bby*bby)) / 8.0);
			if(rrr > ggg) rate = rrr;
			else rate = ggg;
			if(bbb > rate) rate = bbb;

			if(rate < ol) res1 = 255;
			else if(rate < ol + GAP) {
				res1 = 255 - 255 * (rate - ol) / GAP;
			}
			else res1 = 0;

			col.color = target_bmpData.getPixel(x,y); //画像上の画素情報を取得
			rr = col.r;
			gg = col.g;
			bb = col.b;
			gray = (bb*28 + 77*rr + gg*151) / 256;
			
			//色の細かい変化をなくす。
			if(gray > th1)     res2 = 255;
			else if(gray > th2) res2 = 128;
			else if(gray > th3) res2 = 64;
			else res2 = 0;

			res = res1 * res2 / 256;
			col.r = res;
			col.g = res;
			col.b = res;
			bmpData2.setPixel(x, y, col.color);  // 画像に値をセットする
		}
	}
	view.bitmapData = target_bmpData = bmpData2;
	myImage.width = view.width = myImage.width;
	myImage.height = view.height = myImage.height;
}