Yotazo Lab.

ほぼ自分用。でも誰かの役に立つかもしれない話題

Photoshop スクリプトで写真に白枠を作る

やりたいこと

  • 写真が何枚もあり、これに白枠を付けたい

条件

  • レイヤースタイルは使わない(内側境界線を使うと画面が削られてしまうのでNG)
  • 画像サイズに対して、一定の比率の幅を持った白枠を付けたい

カンバスサイズを広げて白レイヤーを敷くにしても、%で広げようとすると縦と横で計算が面倒。画像は何枚もあるのでアクションで対応・・・と思いきや、面倒な計算が入ってくるのでこれも使えない。

てなわけで、色々考えた末、スクリプトでやるしかないんでね? という結論に達し、初めてPhotoshop スクリプトにチャレンジしてみました。

スクリプトの流れ

スクリプトの流れはこのような感じで考えました。

  1. 加工する画像を開いた状態でスタート
  2. 画像の幅を取得
  3. カンバス幅を画像の106%に広げる(白枠の幅)
  4. 白枠が同じ幅になるように、カンバスの高さを広げる
  5. 新規レイヤーを作成し、白で塗りつぶす
  6. 白で塗りつぶしたレイヤーを下に移動

以上をスクリプトJavaScript)で作ります。

とりあえずスクリプト全体

ShiroWaku();
 
function ShiroWaku(){

    //現在アクティブになっているドキュメントを取得
    var doc = activeDocument;

    //画像の幅と高さを取得
    var docWidth = doc.width;
    var docHight = doc.height;

    //カンバス幅を画像の106%に広げる(白枠の幅)
    var newdocWidth = docWidth*1.06;
    var newdocHight = docHight + (newdocWidth - docWidth);
    doc.resizeCanvas( newdocWidth, newdocHight );

    //新規レイヤーを作成し、白で塗りつぶす
    var whiteLayer = doc.artLayers.add().name = "whiteLayer";
    
    //カラーオブジェクトをnew
    var colorObject = new SolidColor();
    //カラーオブジェクトの各プロパティに色をセット
    colorObject.rgb.red = 255;
    colorObject.rgb.green = 255;
    colorObject.rgb.blue = 255;

    //全選択
    doc.selection.selectAll();

    //カラーオブジェクトで塗りつぶし
    doc.selection.fill(colorObject);

    //選択解除
    doc.selection.deselect();

    //whiteLayerを下に移動
    doc.layers.getByName(whiteLayer).move(doc.layers[1],ElementPlacement.PLACEAFTER);

    //できた!

}

解説のようなもの

初めてPhotoshopスクリプトをいじってみて、勉強しながらの解説なので、あまり信頼性はありません。あしからず。

ShiroWaku();

はじめの行は、関数の呼び出し。別に関数にしなくてもいいのですが、当初、その都度白枠の幅を入力して・・・などと壮大なことを考えていたのでこうなりました。無謀でした・・・。

    //現在アクティブになっているドキュメントを取得
    var doc = activeDocument;

加工した画像を開いた状態からのスタートなので、開いている画像がactiveDocumentになります。これを取得して、オブジェクト「doc」として色々いじることになります。

    //画像の幅と高さを取得
    var docWidth = doc.width;
    var docHight = doc.height;

docの幅と高さを取得し、それぞれdocWidth、docHightとします。これをもとに白枠の幅を計算しようという魂胆です。

    //カンバス幅を画像の106%に広げる(白枠の幅)
    var newdocWidth = docWidth*1.06;
    var newdocHight = docHight + (newdocWidth - docWidth);
    doc.resizeCanvas( newdocWidth, newdocHight );

画像横幅の3%分の白枠をつけるため、カンバス横幅を106%に広げたいと思います。

画像の幅(docWidth)に1.06を掛けたものを、新しいカンバスの幅(newdocWidth)とします。
newdocWidth - docWidthが広がった分の幅なので、これをdocHightに加えたものを新しいカンバスの高さ、newdocHightとします。

次に、resizeCanvas()を使ってリサイズします。

resizeCanvas()は、resizeCanvas(幅,高さ,基準位置)なので、それぞれの位置にnewdocWidthとnewdocHightを入れます。第3パラメータはデフォルトが中央のようなので空のままにしておきます。これでカンバスが上下左右に広がります。

    //新規レイヤーを作成し、白で塗りつぶす
    var whiteLayer = doc.artLayers.add().name = "whiteLayer";

画像などのレイヤーはartLayerというそうです。これを追加するのがartLayers.add()で、ついでにwhiteLayerという名前も付けておきます。

    //カラーオブジェクトをnew
    var colorObject = new SolidColor();
    //カラーオブジェクトの各プロパティに色をセット
    colorObject.rgb.red = 255;
    colorObject.rgb.green = 255;
    colorObject.rgb.blue = 255;

    //全選択
    doc.selection.selectAll();

    //カラーオブジェクトで塗りつぶし
    doc.selection.fill(colorObject);

    //選択解除
    doc.selection.deselect();

レイヤーを塗りつぶす方法を調べたら結構面倒でした。まずカラーオブジェクトをnewして、RGBそれぞれのプロパティに色をセットします。その後全選択した後、selection.fill()で塗りつぶします。

    //whiteLayerを下に移動
    doc.layers.getByName(whiteLayer).move(doc.layers[1],ElementPlacement.PLACEAFTER);

最後に、白で塗りつぶしたレイヤーを画像の下に移動します。

移動はmove()ですが、案外面倒です。
move(基準となるレイヤー,移動先)となるので、まずは基準となるレイヤーを指定します。
レイヤーは上からlayers[0]、layers[1]...なので、ここでは画像のレイヤーはdoc.layers[1]になっています。移動先はElementPlacementオブジェクトを使います。PLACEAFTERで基準レイヤーの背面、PLACEBEFOREで前面です。

移動するレイヤーは、先ほど名前をつけておいたので、名前で取得してみます。layers.getByName(whiteLayer)でいけました。

f:id:yotazo:20141201164307j:plain

これで、期待通りの白枠が付きました。