リンクをクリップボードにコピー
コピー完了
Adobe Photoshop上で、開かれた2つの画像(ドキュメント)を使って加工するJSXを作っていますが、初歩的な段階で、わからないことがあります。
アクティブドキュメントの取得は分かるのですが、アクティブドキュメントではない画像の取得が分かりません。
配列を使うと、2枚の画像なら
var doc1 = app.documents[0].name;
var doc2 = app.documents[1].name;
でそれぞれ取得できることはわかるのですが、アクティブドキュメントではない画像の取得をノットイコールでやろうとすると、エラーになってしまいます。
【以下、実際に試してみたのソース】
// アクティブドキュメントの名前をdoc1へ
var doc1 = activeDocument.name;
// アクティブドキュメントではない、もう1枚のドキュメント名をdoc2へ
var doc2 != activeDocument.name;
という意図だったのですがノットイコール != が使えません。
配列を使わない、もう1枚のアクティブでないドキュメント名の取得はどうすればよいでしょうか?
リンクをクリップボードにコピー
コピー完了
勘違いしている箇所が2つあります。
1.演算子について
変数に代入するための代入演算子は = のみです。他にはありません。
!= は比較演算子で、右辺と左辺の比較を行う場合に使います。代入には使えません。
(例)
if (doc2 != activeDocument.name) {…}
//変数doc2がアクティブドキュメントの名前と一致しない場合に何か処理をする
2.アクティブでないドキュメントを特定することはできない
今2つのドキュメントを開いている状態だと思いますが、ドキュメントは3つでも4つでも開くことができますよね。
その場合、アクティブなのは常に1つ(最前面のドキュメント)ですが、アクティブでないドキュメントはそれ以外の
全てのドキュメントになりますよね。つまりドキュメントを4つ開いている場合は、アクティブでないドキュメントは
3つあることになります。その3つのドキュメントのうち、どれを指定したいのですか? という話です。
ですので、「アクティブでないドキュメント」という条件で指定することはできません。
開いているドキュメントのコレクション(app.documents)から指定することになります。
リンクをクリップボードにコピー
コピー完了
CS5 omachi さま
早速の回答とご指摘ありがとうございます。
わたしは会社の業務でPhotoshopを使っており、加工した画像とその元画像の2枚を開いた後、元画像に加工した画像を上書きする…、というよう手動でやると面倒なことをJSXを使ってやろうと考えており、その仕様の流れ図でいうと最初の段階なのですが、ドキュメントは2枚限定という条件をつけています。1枚でも3枚でもダメということですね。
2枚開いている、ということが分かったら2枚のドキュメント名をダイアログに表示し、2枚のうち元画像(ソースの中では、「統合先画像」)と加工した画像(同じく「修整済画像」)を、入れ替えボタンを使ってどちらに対してもアクションが実行できるようにしようと考えています。
それで最初に考えたのは、元画像をアクティブにすれば、アクティブドキュメント名は取得でき、それ以外のドキュメント名を修整済画像ということで取得したかったのです。でもおっしゃる通り、条件をつけなければ3枚も4枚も開くことができます。
なので、最初はアクティブでないドキュメントはドロップダウンリストなどでいくつも指定できるようにし、そこから選んだドキュメント名を.selectionとしてもう1枚の画像に代入する仕様にしていたのですが、2枚しか開かないという前提での仕様にしたら分からなくなってしまったのです。
「2枚のみ限定」という仕様に変更したのと同時に、元画像と加工した画像の名前をダイアログ上のボタンで入れ替えられるようにしたらもっと楽だろうということとなり、①入れ替えるにはどうすればいいのか、②入れ替えて実行した際に、どうやって元画像だと判定すればいいのか、以上の2点も分からない状況です。
今回の質問でいうと、「=!」は使えないというご指摘でしたので、仕様を変えて書き直しました。
現在のソースはこんな感じです。実際に動かすことができます。
---
#target Photoshop
if(documents.length == 2)
{
var doc1 = app.documents[0].name;
var doc2 = app.documents[1].name;
alert('doc1は '+doc1 + '\n' + 'doc2は '+doc2);
////////////////////// ダイアログここから //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var uDlg = new Window('dialog','画像のマージ');
uDlg.center(); //ダイアログを中央に表示
// 開始座標のx,y 長さの座標x,y
uDlg.bounds = [200+400,100+100,520+400,400+30];
// 囲い線①
uDlg.add('panel',[20,10,300,60],'統合先画像','etched');
// 画像1
uDlg.add('statictext',[40,30,300,50],''+doc1+'');
// uDlg.add('edittext',[40,30,300,50],''+doc1+'');
var textObj = uDlg.add('statictext',[110,68,180,68+20], '上記の画像に');
textObj.justify = 'center';
// 入れ替えボタン
uDlg.changeBtn = uDlg.add('button',[200,65,300,65+20], '↑入れ替え↓');
// 囲い線②
uDlg.add('panel',[20,85,300,135],'修整済画像','etched');
// 画像2
uDlg.add('statictext',[40,105,300,50],''+doc2+'');
// uDlg.add('edittext',[40,105,300,50],''+doc2+'');
var textObj2 = uDlg.add('statictext',[100,140,190,140+40], 'の画像をコピーする');
textObj2.justify = 'center';
uDlg.okBtn = uDlg.add('button',[20,150+20,150,150+50], '実 行', { name:'ok'});
uDlg.cancelBtn = uDlg.add('button', [20+150,150+20,300,150+50], 'キャンセル', {name: 'cancel'});
// //閉じるボタン
// uDlg.closeBtn = uDlg.add('button', [20+150,150,300,150+30], '閉じる', {name: 'close'});
uDlg.changeBtn.onClick = function()
{
try{
// ダイアログに表示された画像2枚を入れ替える動作
/* var doc3 = app.documents[2].name;
doc3 = doc1;
doc1 = doc2;
doc2 = doc3;
*/
return;
}
catch(e){}
}
///////////////////////// ダイアログここまで ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//実行ボタン押下後の判定
uDlg.okBtn.onClick = function()
{ // ②ダイアログボタン
//実行がクリックされた時点でダイアログを閉じる
uDlg.close ();
}
uDlg.show();
}
else
{
alert('画像を「2枚」開いてくださいネ','画像のマージ');
}
リンクをクリップボードにコピー
コピー完了
知恵袋の続きですね。
すみません、根本的なところの疑問なんですが、なぜPhotoshopで、JSでこの操作を行うのでしょうか?
File操作ではいけませんか?画像のマージというよりも、旧ファイルを新ファイルと同じにする動作と捉えていますが、合っていますか?
#元画像に上書きする、という操作に危険な香りがしてます。
また
・(手動)二枚開く
・(手動)最新をアクティブ
・全選択してコピー
・ショートカットキーでドキュメント入れ替え
・ペースト
・後処理
という流れならアクションで可能です。
リンクをクリップボードにコピー
コピー完了
もしかして、知恵袋のyamo_pressさんですか?
知恵袋ではお世話になりました!
ドキュメントが2枚で、app.documents[0]がアクティブでない場合の対処法がわかりました。こんな感じです。
↓
// original 開いているアクティブ画像の変数
var original = app.activeDocument;
var doc1 = app.documents[0];
var doc2 = app.documents[1];
if(doc1.name == original.name){
}
else
{
// アクティブドキュメントが1個目のドキュメントじゃない時の入れ替え
var doc3;
doc3 = doc1;
doc1 = doc2;
doc2 = doc3;
}
です。
それと、Photoshopでこの操作を行う理由ですが、業務の中で画像を新しいものに上書きする場面があり、手動ではもちろんできますし、アクションに登録することもわかってはいるのですが、画像に付随しているキャプションを的確に判断して、関連している画像なのかをチェックする必要があり、それをアクションや手動では違う画像(似たような画角だけど、撮影日時はまったく違う画像)を上書きしてしまうおそれもあり、JSXでチェック機能を果たすのが目的です。
僕自身も、JSXは今回初めて触ったものなので、古籏一浩さんのAdobe JavaScriptリファレンスや自動化などの書籍を買って調べていましたが、それでもわからなかったので質問させていただきました。
リンクをクリップボードにコピー
コピー完了
お二方とも、ありがとうございました!
また違うことで質問させていただくことがあるかと思いますが、その時はよろしくおねがいいたします。