JavaScriptでフィルタを作る

前にも書いてしまったのですがJavaScriptでPhotoshopのフィルタを作ることができます。スクリプトなので低速です。実行後にPhotoshopをバックグラウンドにしておくと多少は速くなります。
以下のサンプルはランダムにピクセル値を読み出して緑色の輝度だけ2倍にするエフェクトです。

function getPixel(x,y)
{
var R = G= B= 0,data;
var docObj = activeDocument;
var selReg = [[x,y],[x+1,y],[x+1,y+1],[x,y+1],[x,y]];
docObj.selection.select(selReg);
var data = docObj.channels[0].histogram;
for (var i=0; i<data.length; i++) if (data[i] > 0) { R = i; break; }
data = docObj.channels[1].histogram;
for (i=0; i<data.length; i++) if (data[i] > 0) { G = i; break; }
data = docObj.channels[2].histogram;
for (i=0; i<data.length; i++) if (data[i] > 0) { B = i; break; }
docObj.selection.deselect();
return [R,G,B];
}
// ランダムピクセルエフェクト
preferences.rulerUnits = Units.PIXELS;
docObj = activeDocument;
w = docObj.width.value;
h = docObj.height.value;
RGBColor = new SolidColor();
for (i=0; i<20; i++) // 20が描く点の総数
{
x = Math.floor(Math.random() * w);
y = Math.floor(Math.random() * h);
rgb = getPixel(x,y);
// 緑の輝度を2倍に増やして描画
n = rgb[1] * 2;
if (n > 255) n = 255;
RGBColor.red = rgb[0];
RGBColor.green = n;
RGBColor.blue = rgb[2];
selReg = [[x,y],[x+1,y],[x+1,y+1],[x,y+1],[x,y]];
docObj.selection.select(selReg);
docObj.selection.fill(RGBColor, ColorBlendMode.NORMAL, 100, false);
}

実際には速度だけでなく、いくつか制限があります。まず、アルファチャンネルを利用してヒストグラムから輝度を読み出しているため表示されている状態でのピクセル値が読み出されてしまいます。つまり特定のレイヤーのピクセル値に対して処理を行いたい場合は、他のレイヤーおよび背景(できれば背景画像はない方がよい)は非表示にしておく必要があります。
また、透明のサポートはできないため、透明部分に対しては処理しない、ということができないか困難です。
16ビットモードでも不可能ではありませんが、実用的ではないでしょう。それ以前に8ビットモードでも実用的ではない速度です。

しかし、フィルタが存在せずちょっとしたピクセル処理をPhotoshopで行わなければならない場合には役立つのではないかと思います。




[サンプルをダウンロード]