JavaScriptで画像を赤くする

メモ: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]
}

スポンサーリンク