このページの本文へ

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

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

文●古籏一浩

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

繰り返しの無駄を省いてスピードアップする

 “最適化する”とはいっても、そもそもPhotoshopのJavaScriptエンジン自体の処理が遅いため、劇的な改善は望めません。それでも、繰り返し部分の処理時間が少しでも短くなれば、全体ではそれなりのスピードアップが見込めます。

 前のページのサンプルでは、ピクセルの読み出し時に選択範囲を作成してピクセルを選択し、書き込み時にもまったく同じようにピクセルを選択し直していました。今回は読み出し時に選択した状態をそのままにしておき、書き込みの処理を続けるようにします。getPixel()関数を呼び出すのにもわずかですがオーバーヘッドがあるため関数にせず、繰り返しの中に直接書いてしまいましょう。

 また、処理する画像の横幅や縦幅があらかじめ決まっている場合、繰り返しの数を直接指定することでプロパティを読み出すことがなくなり、若干処理が速くなります。

 以上の方法で最適化したソースコードを以下に示します(サンプル02)。


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


// 自分で作成したフィルターを実行
s = (new Date()).getTime();
myFilter();
e = (new Date()).getTime();
alert("time = "+(e-s)/1000+" sec");
// ピクセルエフェクト
function myFilter(){
    preferences.rulerUnits = Units.PIXELS;
    var docObj = activeDocument;
    RGBColor = new SolidColor();
    var data,i,R;
    for (y=0; y<100; y++) {
        for (x=0; x<100; x++){
            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 * 2; break; }
            if (R > 255) R = 255;
            RGBColor.red = R;
            data = docObj.channels[1].histogram;
            for (i=0; i<256; i++) if (data[i] > 0) { RGBColor.green = i * 0.5; break; }
            data = docObj.channels[2].histogram;
            for (i=0; i<256; i++) if (data[i] > 0) { RGBColor.blue = i * 0.5; break; }
            docObj.selection.fill(RGBColor, ColorBlendMode.NORMAL , 100, false);
        }
    }
    activeDocument.selection.deselect();
}


 前のプログラムと同じ条件で計測したところ、今度は347秒(約5.8分)で処理が完了しました。72秒の高速化が図れたことになります。ただ、「高速化された」と言っても相変わらず遅いことには変わりません。もっとよいピクセルの読み出し、書き込み方法を思いついたらぜひWebに公開してください。また、アドビのユーザーフォーラムにリクエストとして書き込んでもよいでしょう。


 今回ご紹介したように、普段とは違った環境で動かすJavaScriptもなかなか面白いものです。この機会に、PhotoshopのJavaScriptに触れてみてはいかがでしょうか。


■もっと勉強したい人のための参考書(Amazon.co.jp)

この連載の記事

一覧へ

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