基準位置から指定したピクセル数移動させる

会社のログやマークや写真などをキャンバスの右上から横に40ピクセル、縦に30ピクセルの位置に配置するように、といった要求があります。Photoshopでは少し手間がかかってしまいます。マスウやカーソルキーで情報パレットを見ながら正確な位置に移動させなければならないためです。
このような場合にはスクリプトで処理すると簡単です。特にバッチ処理などで全ての画像の右下にロゴや文字を入れる場合に便利です。
ただ、スクリプトでもキャンバス上の任意の位置に移動させる命令がなく、相対的に移動させる命令しかありません。そこで、移動させるレイヤーの大きさを取得してから座標を計算し相対的に移動させます。
以下のサンプルはアクティブになっているレイヤーを、それぞれの基準位置から横に40ピクセル、縦に10ピクセル移動させるものです。

●左上を基準にして移動
preferences.rulerUnits = Units.PIXELS;
offsetX = 40; // 左側からの位置(40 pixel)
offsetY = 10; // 上側からの位置(10 pixel)
docObj = activeDocument;
layObj = docObj.activeLayer; // アクティブレイヤー
w = docObj.width.value;
h = docObj.height.value;
x1 = parseFloat(layObj.bounds[0]);
y1 = parseFloat(layObj.bounds[1]);
layObj.translate(offsetX-x1, offsetY-y1);

●右上を基準にして移動
preferences.rulerUnits = Units.PIXELS;
offsetX = 40; // 左側からの位置(40 pixel)
offsetY = 10; // 上側からの位置(10 pixel)
docObj = activeDocument;
layObj = docObj.activeLayer; // アクティブレイヤー
w = docObj.width.value;
h = docObj.height.value;
x2 = parseFloat(layObj.bounds[2]);
y1 = parseFloat(layObj.bounds[1]);
layObj.translate(w-offsetX-x2, offsetY-y1);


●左下を基準にして移動
preferences.rulerUnits = Units.PIXELS;
offsetX = 40; // 右側からの位置(40 pixel)
offsetY = 10; // 下側からの位置(10 pixel)
docObj = activeDocument;
layObj = docObj.activeLayer; // アクティブレイヤー
w = docObj.width.value;
h = docObj.height.value;
x1 = parseFloat(layObj.bounds[0]);
y2 = parseFloat(layObj.bounds[3]);
layObj.translate(offsetX-x1, h-offsetY-y2);

●右下を基準にして移動
preferences.rulerUnits = Units.PIXELS;
offsetX = 40; // 右側からの位置(40 pixel)
offsetY = 10; // 下側からの位置(10 pixel)
docObj = activeDocument;
layObj = docObj.activeLayer; // アクティブレイヤー
w = docObj.width.value;
h = docObj.height.value;
x2 = parseFloat(layObj.bounds[2]);
y2 = parseFloat(layObj.bounds[3]);
layObj.translate(w-offsetX-x2, h-offsetY-y2);

位置が固定されていない場合には以下のようにダイアログを出して値を入力するようにすることもできます。

●ダイアログで位置を入力
preferences.rulerUnits = Units.PIXELS;
offsetX = parseFloat(prompt("横位置",20));
offsetY = parseFloat(prompt("縦位置",10));
docObj = activeDocument;
layObj = docObj.activeLayer; // アクティブレイヤー
w = docObj.width.value;
h = docObj.height.value;
x1 = parseFloat(layObj.bounds[0]);
y1 = parseFloat(layObj.bounds[1]);
layObj.translate(offsetX-x1, offsetY-y1);


また、単位はピクセルになっていますが、一番最初の行のUnits.PIXELSをUnits.MMにするとミリメートル単位になります。他の単位も指定できますが、この2つが指定できれば十分実用になるでしょう。




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