赤色を強調するフィルターを作る
ここまでに説明したことの仕上げとして、赤の輝度を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ピクセルあたりの書き込みに非常に時間がかかっていることが分かりました。次ページでは全体の処理が速くなるように、プログラムを最適化してみましょう。