配列コピー(大量に同じ画像を並べる)

レイヤーに描かれた図やイラスト、写真などを縦横に大量に並べたい場合があります。こんな時、大きさに変化がない場合にはパターンで登録して塗りつぶせばできあがります。しかし、1つずつ大きさを変えたり、回転角度を個別に変えるとなるとパターンでは対応ができません。また、手作業で行うにしても大変時間がかかってしまいます。
そんな場合には以下のスクリプトを使えば縦横に指定した数だけアクティブレイヤーの内容をコピーしてくれます。

w = parseInt(prompt("横の繰り返し数",3));
h = parseInt(prompt("縦の繰り返し数",2));
stepW = parseInt(prompt("横の移動量",40));
stepH = parseInt(prompt("縦の移動量",30));
activeDocument.activeLayer.copy();
activeDocument.selection.deselect();
for (y=0; y<h; y++)
{
for (x=0; x<w; x++)
{
activeDocument.paste();
activeDocument.activeLayer.translate(x*stepW,y*stepH);
}
}

このままだと大量にレイヤーが生成されるので、1つのレイヤーにまとめたい場合には

activeDocument.activeLayer.translate(x*stepW,y*stepH);

activeDocument.activeLayer.translate(x*stepW,y*stepH);
activeDocument.activeLayer.merge();

のように変更します。ただし、シェイプやテキストレイヤーの場合には、ラスタライズしておかないとエラーになります。このスクリプトは単純に縦横にコピーするものですが、少しずつ回転させたい場合には以下のスクリプトを使いましょう。

w = parseInt(prompt("横の繰り返し数",3));
h = parseInt(prompt("縦の繰り返し数",2));
stepW = parseInt(prompt("横の移動量",40));
stepH = parseInt(prompt("縦の移動量",30));
rot = parseInt(prompt("回転角度",15));
activeDocument.activeLayer.copy();
activeDocument.selection.deselect();
n = 0;
for (y=0; y<h; y++)
{
for (x=0; x<w; x++)
{
activeDocument.paste();
activeDocument.activeLayer.translate(x*stepW,y*stepH);
activeDocument.activeLayer.rotate(n,AnchorPosition.MIDDLECENTER);
n = n + rot;
}
}

回転させるのでなく、大きさを変えたいという場合には以下のスクリプトでできます。

w = parseInt(prompt("横の繰り返し数",3));
h = parseInt(prompt("縦の繰り返し数",2));
stepW = parseInt(prompt("横の移動量",40));
stepH = parseInt(prompt("縦の移動量",30));
scl = parseInt(prompt("スケール変化量(%)",-2));
activeDocument.activeLayer.copy();
activeDocument.selection.deselect();
n = 100;
for (y=0; y<h; y++)
{
for (x=0; x<w; x++)
{
activeDocument.paste();
activeDocument.activeLayer.translate(x*stepW,y*stepH);
activeDocument.activeLayer.resize(n,n,AnchorPosition.MIDDLECENTER);
n = n + scl;
}
}

均等に配置されているけど、ちょっとずれている(ややランダム)ような並べ方も可能です。




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