メモ:JavaScriptで画像に赤いフィルタをかけてみる
・画像を読み出し1ピクセルを取得する
・R値*2 G値*0.5 B値*0.5
・読み出したピクセルに計算結果を上書き
・画像サイズ分繰り返す
感想:
めちゃくちゃ遅い。繰り返し処理の部分が特に悪さをしていそう…。
動いたのはうれしいが、正直実用性はなさそう…。
まだまだ先は長そうだ…。
JavaScriptでバイラテラル処理を作成しようと考えているのだが
これでは使い物にならなさそうだ。しばらく試行錯誤が続きそう。
以下ソース
//処理計測開始 s=(new Date()).getTime(); //フィルタ処理 myFilter(); //処理計測終了 e=(new Date()).getTime(); alert("time = "+(e-s)/1000+"sec");
//フィルタ処理の内部 function myFilter(){ preferences.rulerUnits = Units.PIXELS; var R = 0; docObj = activeDocument; RGBColor = new SolidColor(); var Normal = ColorBlendMode.NORMAL; for( y=0; y < docObj.height.value; y++){ for(x=0; x < docObj.width.value; x++){ rgb = getPixel(x,y); R = rgb[0] * 2; if( R > 255) R =255; RGBColor.red = R; RGBColor.green = rgb[1] * 0.5; RGBColor.blue = rgb[2] * 0.5; docObj.selection.select([[x,y],[x+1,y],[x+1,y+1],[x,y+1],[x,y]]); docObj.selection.fill(RGBColor, Normal, 100, false); } } activeDocument.selection.deselect(); }
//ピクセルごとの値を取得する function getPixel(x,y){ var R = G = B = 0,data, i; var docObj = activeDocument; docObj.selection.select([[x,y],[x+1,y],[x+1,y+1],[x,y+1],[x,y]]); data = docObj.channels[0].histogram; for(i = 0; i < 256; i++) if(data[i] > 0 ) { R = i; break; } data = docObj.channels[1].histogram; for(i = 0; i < 256; i++) if(data[i] > 0 ) { G = i; break; } data = docObj.channels[2].histogram; for(i = 0; i < 256; i++) if(data[i] > 0 ) { B = i; break; } return [R,G,B] }