Photoshop スクリプトで写真に白枠を作る
やりたいこと
- 写真が何枚もあり、これに白枠を付けたい
条件
- レイヤースタイルは使わない(内側境界線を使うと画面が削られてしまうのでNG)
- 画像サイズに対して、一定の比率の幅を持った白枠を付けたい
カンバスサイズを広げて白レイヤーを敷くにしても、%で広げようとすると縦と横で計算が面倒。画像は何枚もあるのでアクションで対応・・・と思いきや、面倒な計算が入ってくるのでこれも使えない。
てなわけで、色々考えた末、スクリプトでやるしかないんでね? という結論に達し、初めてPhotoshop スクリプトにチャレンジしてみました。
スクリプトの流れ
スクリプトの流れはこのような感じで考えました。
- 加工する画像を開いた状態でスタート
- 画像の幅を取得
- カンバス幅を画像の106%に広げる(白枠の幅)
- 白枠が同じ幅になるように、カンバスの高さを広げる
- 新規レイヤーを作成し、白で塗りつぶす
- 白で塗りつぶしたレイヤーを下に移動
以上をスクリプト(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)でいけました。
これで、期待通りの白枠が付きました。