このページの本文へ

PhotoshopのフィルターをJavaScriptで作る! (3/5)

2009年07月20日 12時36分更新

文●古籏一浩

  • この記事をはてなブックマークに追加
本文印刷

赤色を強調するフィルターを作る

 ここまでに説明したことの仕上げとして、赤の輝度を2倍に、緑と青の輝度を半分にするシンプルなフィルターを作成してみましょう。

 ピクセル値を読み出す部分はgetPixel() という関数を作成しました。指定された座標にあるピクセルのRGBそれぞれの輝度を読み出して配列として返す関数です。画像全体に対して適用するので、for() を入れ子にして横と縦のピクセル数だけ繰り返しています。画像のピクセル数は以下のプロパティで参照できます。

横幅
activeDocument.width.value
縦幅
activeDocument.height.value


 実際の完成したソースコードを以下に示します(サンプル01)。


●サンプル01のソースコード


// 自分で作成したフィルターを実行
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();
}
//---------------------------------------------
// ピクセル値を取得する(8bitモード専用)
//---------------------------------------------
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];
}


左上の画像がフィルター実行前。実行すると右下のように赤色が強調された画像になる

左上の画像がフィルター実行前。実行すると右下のように赤色が強調された画像になる

 実際に実行してみると分かりますが、このプログラムは非常に処理に時間がかり、あまり実用的とは言えません。筆者の環境(MacPro:Dual Core Xeon 3GHz) では、100×100ピクセルの画像でも419秒(約7分)もかかってしまいました。

 検証してみるとピクセルの読み出しが遅いだけでなく、1ピクセルあたりの書き込みに非常に時間がかかっていることが分かりました。次ページでは全体の処理が速くなるように、プログラムを最適化してみましょう。

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています