PhotoShop スクリプトでレイヤ貼り付け

PHOTOGRAPH[写真] PC[コンピュータ]

よくあると思いますが、画像にコピー禁止の透かしを入れる場合。
この処理は、私の写真処理システムでもプログラムで実施していたのですが、どうも微妙に透かし文字が本来よりもズレるという事が最近わかってきた。

これまでの処理では、透かし文字を自由定義した画像ファイルから、その文字レイヤをコピーして、対象の画像にペイストしていた。

要は人間操作が行う、レイヤのコピー&ペイスト処理をスクリプトプログラムを介して、PhotoShopで動かしていた。

手動で行うレイヤのコピー&ペイストでも、ズレる事があるというのを最近知った。
PhotoShopでは通常ペイスト(CTRL+V)と特殊ペイスト(SHIFT+CTRL+V)の2種類がある。

実際にスクリプトに用意されているのは、通常ペイストのみで一種類。
貼り付ける物を詳細な構成要素としては、文字に対してオブジェクトの大きさと位置という2種類の属性がある。

大きさに関しては、特段変わる事はなく問題ないわけですが、位置情報がどうも不定というのが、調べた結果です。
恐らくは、オブジェクトを囲む最小矩形領域をコピーし、それを対象画像にペイストしている模様だが、ペイストしている位置がどうも、画像の中心位置でない場合がある模様。

実際には、スクリプトガイドを見ても、レイヤのコピーはあっても、レイヤのペイストなる物が定義されていません。
ただしペイストは動作しますが、どうもそれは正しい使い方ではないようです。
ペイストにはどの位置に貼り付けるかという情報が伴う必要があるようです。

レイヤ貼り付けの方法に関しては、2通りがあると思えます。

1.貼り付け後レイヤ移動

不確定な位置へ貼り付けられたレイヤに対して、再度、適切な位置にそのレイヤを移動させる方法。

ただし適切な場所というのが、一度貼り付けられた後は元の位置情報がわからないので、そのオブジェクトの大きさ(矩形の四隅)はわかるので、例えば、そのオブジェクトを、貼り付け後の画像全体の中央に移動させるというのであれば、できそう。

元々レイヤ内のオブジェクトに関しては、透明ピクセル部分を除いた、オブジェクトを囲む最小矩形がコピー対象となっている。
この為、例えば元々のオブジェクトが画像全体の真ん中以外に定義されている場合には、この方法では、オブジェクトが本来の位置でなく、真ん中に移動してしまうという問題がある。

まぁ コピー禁止の意味合いの文字なので、真ん中でも良いわけですが、プログラムとしての汎用性が少ないので、これは他の手段がダメな場合に採択する事にする。

2.貼り付け後元の位置情報でレイヤ移動

貼り付け元のオブジェクトの状態として 大きさと位置の情報は取得可能。
よって、貼り付け後に、元の位置情報を利用してオブジェクトを移動させれば良い。
この方法が実現できれば、これが一番簡単で、汎用性が高い。

3.貼り付け時に貼り付け領域を明示して貼り付ける

これは、PhotoShopの例でも記載されている方法で、これが正しいやり方と思える。
考え方は、貼り付け対象画像に対して、貼り付け領域を設定しておき、その箇所にPasteするという物。
以下にコードイメージを示しておく
—–
元レイヤに対してbounsでa,b,c,dを求めておき、元レイヤはcopyする
selRegion = Array(a,b,c,d)
afterDoc.Selection.Select(selRegion)
afterDoc.Paste
—-

対応結果

上記2の方法は既に、写真番号を画像の中に設定する時に対応していたので、今回は2の方法で実施してみた。

Aは 従来プログラムで動作していたPaste結果
Bは 今回プログラムの改造で元の位置の箇所にPasteした物

Bは結論から言えば、プログラムで特殊Pasteを実施した事になります。
なを 特殊Pasteというのは、スクリプトのコマンドにはありません。
(上記写真番号の大きさが違うのは元画像の大きさが違う物を比較対象しているので…)

めでたし(^_^)