Photoshop CS5/CS6編 4色グラデーション

今回はPhotoshop CS5/CS6で4色グラデーションを描画するスクリプトです。CS5専用でCS3/CS4では動作しません。これはCS5から追加されたカラーピッカーを利用しているためです。
以下のスクリプトを実行すると4回カラーピッカーが表示されます。色は左上、右上、左下、右下の順番で指定していきます。なお、このスクリプトは非常に低速です。ESTK (Extend Script Tool Kit) から実行すれば進行状況がJavaScriptコンソールに表示されます。


// 4色グラデーションを描画
(function(){
// 単位を保存しPixelに設定する
var saveUnit = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
// カラーピッカーを表示
app.showColorPicker();
var p1 = app.foregroundColor.rgb; // 左上のカラー
app.showColorPicker();
var p2 = app.foregroundColor.rgb; // 右上のカラー
app.showColorPicker();
var p3 = app.foregroundColor.rgb; // 左下のカラー
app.showColorPicker();
var p4 = app.foregroundColor.rgb; // 右下のカラー
// 選択範囲座標を取得
var rect = app.activeDocument.selection.bounds;
var x1 = parseInt(rect[0]);
var y1 = parseInt(rect[1]);
var x2 = parseInt(rect[2]);
var y2 = parseInt(rect[3]);
var RGBColor = new SolidColor();
// グラデーションを描画する前に処理を高速化する前計算(加算方式)
var gradW = x2-x1; // 縦幅
var gradH = y2-y1; // 縦幅
var dRL = (p3.red - p1.red)/gradH; // 加算数
var dGL = (p3.green - p1.green)/gradH;
var dBL = (p3.blue - p1.blue)/gradH;
var dRR = (p4.red - p2.red)/gradH; // 加算数
var dGR = (p4.green - p2.green)/gradH;
var dBR = (p4.blue - p2.blue)/gradH;
var startRL = p1.red; // 開始色(左側)
var startGL = p1.green;
var startBL = p1.blue;
var startRR = p2.red; // 開始色(右側)
var startGR = p2.green;
var startBR = p2.blue;
var CM = ColorBlendMode.NORMAL;
for(var y=y1; y<y2; y++){
var dR = (startRR - startRL)/gradW; // 横の加算数
var dG = (startGR - startGL)/gradW;
var dB = (startBR - startBL)/gradW;
var tR = startRL;
var tG = startGL;
var tB = startBL;
for(var x=x1; x<x2; x++){
var area = [[x,y],[x+1,y],[x+1,y+1],[x,y+1]];
app.activeDocument.selection.select(area);
RGBColor.rgb.red = parseInt(tR);
RGBColor.rgb.green = parseInt(tG);
RGBColor.rgb.blue = parseInt(tB);
app.activeDocument.selection.fill(RGBColor,CM, 100, false);
tR += dR;
tG += dG;
tB += dB;
}
startRL += dRL;
startGL += dGL;
startBL += dBL;
startRR += dRR;
startGR+= dGR;
startBR += dBR;
$.writeln((y-y1)+"/"+(y2-y1));
}
preferences.rulerUnits = saveUnit;
app.activeDocument.selection.deselect();
})();

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