イラスト調変換
エフェクト処理の中にイラスト調変換を実装
こんな感じ
閾値をいくつか設定して、その値ごとに色を決めて、
色の細かい変化なくしています。
ソース
//イラスト調変換 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; }