javascript に関する質問です。
javascriptに詳しい方、もしくはスクリプトを作成する時間がある方で作成できるかたおりましたらよろしくお願いいたします。
現在adobe photoshop7を使用しているのですが、photoshopのスクリプトを作成したいと考えています。
作成しようとしているスクリプトは、プログラムを実行すると6枚の写真を元に加工された写真を3枚自動で作成するというプログラムです。
加工するフォルダなどがあるファイルの環境は以下になります。
http://oskuni7.sakura.ne.jp/hatena/question5/foruda.htm
実行したいプログラムの詳細は以下になります。
http://oskuni7.sakura.ne.jp/hatena/question5/puroguramu.htm
scriptを作成していただき、実際に動いた場合は1000pt差し上げさせていただければと考えております。
adobe script に関してのアドバイスでもかまいません。
お手数をおかけしますが、どうぞよろしくお願いいたします。
一応複数ファイルに対応してみました。
// Global define // ★★★実際のパスに変更してください。 var rootFolder = "C:/Users/yoshi/Desktop/adobe script/"; var startRulerUnits = preferences.rulerUnits; var startTypeUnits = preferences.typeUnits; var startDisplayDialogs = displayDialogs; // Set preferences.rulerUnits = Units.PIXELS; preferences.typeUnits = TypeUnits.PIXELS; displayDialogs = DialogModes.NO; // Jpeg Option var jpegOpt = new JPEGSaveOptions(); jpegOpt.embedColorProfile = true; jpegOpt.quality = 2; jpegOpt.formatOptions = FormatOptions.PROGRESSIVE; jpegOpt.scans = 3; jpegOpt.matte = MatteType.NONE; // 画像サイズ変換関数 function SizeConvert( srcFolder, dstFolder ) { var folderObj = Folder(rootFolder + srcFolder ); var fileList = folderObj.getFiles(); for( var i=0 ; i< fileList.length ; i++ ) { srcFileObj = new File( fileList[i].fsName ); var dFilePath = fileList[i].fsName.replace( srcFolder, dstFolder ); var dstFileObj = new File( dFilePath ); srcFileObj.copy( dstFileObj ); var cPic = open(dstFileObj); cPic.activeLayer.applySharpen(); cPic.resizeImage(600,450); cPic.saveAs(dstFileObj, jpegOpt, true, Extension.LOWERCASE); cPic.close(SaveOptions.DONOTSAVECHANGES); } } // 画像結合関数 function MergeImage( srcFolderArray, dstFolder ) { var folderObj = Folder(rootFolder + srcFolderArray[0] ); var selRegion = Array( Array(0, 0), Array(1, 0), Array(1, 1), Array(0, 1), Array(0, 0)); var fileList = folderObj.getFiles(); for ( var n=0 ; n< fileList.length ; n++ ) { var dstPath = fileList[n].fsName.replace( srcFolderArray[0], dstFolder ); var dstFile = new File( dstPath ); var cPic = documents.add( 600, 450, 72, dstFile.name ); for( var p=0 ; p<4 ; p++ ) { var srcFileObj = new File( fileList[n].fsName.replace( srcFolderArray[0], srcFolderArray[p] )); var addPic = open( srcFileObj ); addPic.activeLayer.applySharpen(); addPic.resizeImage( 300, 225 ); addPic.activeLayer.copy(); addPic.close(SaveOptions.DONOTSAVECHANGES ); activeDocument = cPic; cPic.selection.select( selRegion ); cPic.paste(); cPic.activeLayer.translate( ( p % 2 ) * 300, Math.floor( p / 2 ) * 225 ); } cPic.saveAs( dstFile, jpegOpt, true, Extension.LOWERCASE); cPic.close( SaveOptions.DONOTSAVECHANGES ); } } // 変換処理 SizeConvert( "kakou_picture1", "kakougo_picture1" ); SizeConvert( "kakou_picture2", "kakougo_picture2" ); MergeImage( Array( "kakou_picture3", "kakou_picture4", "kakou_picture5", "kakou_picture6" ), "kakougo_picture3" );
http://ja.wikipedia.org/wiki/GD_Graphics_Library
個人的には「ImageMagick」が扱いやすくて好きですが、そこらへんは好みでしょうか。
http://ja.wikipedia.org/wiki/ImageMagick
ちなみにImageMagickはコマンドラインから実行できるツールがWindows版にもついてきますので、多少DOSがいじれれば、プログラムを組む必要もありません。結構キレイに加工できますよ。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070704/276677/
実行してみたところエラーが発生しました。
エラー 21:undefined がオブジェクトでありません。
ライン:66
→ cpic.saveAs(dstFileObj,jpegOop.true.Extension.LOWERCASE);
上記の様なメッセージを返されたのですが、どのように対処すればよろしいでしょうか。
お手数をおかけしますがどうぞよろしくお願いいたします。
JavaScript は大文字小文字を認識しますので、もし仮にスクリプト中に
cPic ではなく、cpic としていたら、当該のエラーになります。
一応上記は PhotoShop CS4 Extended(評価版^^;;)で動作確認済みのものです。
内容をそのままファイルにコピーし、aiomock.js などの名前で保存し、
「ファイル」⇒「スクリプト」⇒「参照」でファイルを選択すれば、実行されると思いますが、
そのように実行されているでしょうか。
http://codezine.jp/article/detail/406?p=1
(「参考:Photoshop CS2でのスクリプト」 の部分参照)
お使いのバージョン情報等も提示いただいた方がよいかと思います。
ファイル名は photoshop.js
で 頂いたスクリプトをそのままコピーして貼り付けを行いました。
バージョンは同じくCS4の体験版を使用して行ってみましたが 同じエラーが発生します。
スクリプトをアップしてみました。
http://oskuni7.sakura.ne.jp/hatena/question6/photoshop.js
またフォルダの中身もアップしてみました。
http://oskuni7.sakura.ne.jp/hatena/question6/forudanai.jpg
お手数をおかけしますがご確認をしていただいてよろしいでしょうか。申し訳ありません。
デバッグウィンドウが起動したら、F11で1ステップずつ実行されると思いますが、
エラーが出るまでの処理は問題なく動作しているでしょうか?
エラーが出た際の状況(画面の状態、ファイルの状態)がどのようになっているかを
ご報告ください。
F11で1ステップずつ実行したのですが、画面は何も作業が行われていない状況です。
最初のadobe scriptフォルダへのリンク指定が間違っているということでしょうか。(確認をして直接コピー&ペーストしたのですが・・)
通常通り実行するとやはり
66行目 cPic.saveAs(dstFileObj, jpegOpt, true, Extension.LOWERCASE);
がエラーであると表示されてしまいます。
パスの指定のせいだと思います。
"C:¥...¥...¥..."(円マーク) は JavaScript では "C:¥¥...¥¥...¥¥..."
のように一つの¥(実際は半角)を表すのに二つ続けて書きます
(¥特殊な文字なのでそのままではだめなのです)。
もしくは例のように
"C:/.../.../..."
としてください。
ありがとうございます^^。
後、最後にお聞きしたいのですが、このプログラムを実行するとフォルダに入っている最初の写真しか実行されませんでした。
入っている写真をすべてプログラムどおり実行するにはどのようにすればよろしいのでしょうか?
またテンプレート(PSD形式の)をあらかじめ用意しておいてその下に画像をおいていくという様なこともできるのでしょうか?
(壁紙がいくつかあるのでその下に加工後写真を持っていきたいと考えています。)
PSD形式(レイヤーの画像)の下にサイズ変更した画像(レイヤー)をおくという作業をやりたいと思うのですが、可能でしょうか?
加工後写真1枚目、加工後写真2枚目、加工後写真3枚目の壁紙レイヤーをリンク指定で呼び込みたいと思っております。
(リンク指定ですと壁紙も変更できるため。。)
少し質問が多くなり申し訳ありませんが、お時間がありましたらよろしくお願いいたします。
それは想定外でした。
その場合、最初の二つのフォルダはよいのですが、3番目以降のフォルダに関しては
それぞれのフォルダからどの4画像を組み合わせて、一枚にするのでしょうか。
また、それぞれのフォルダに入っている画像数はみな同じ枚数なのですか。
このあたりをご説明いただければ、対応できるかと思います。
>またテンプレート(PSD形式の)をあらかじめ用意しておいてその下に画像をおいていくという様なこともできるのでしょうか?
>(壁紙がいくつかあるのでその下に加工後写真を持っていきたいと考えています。)
スクリプトでそのような処理をすることは可能かと思いますが、なさりたいことの仕様も
わからない部分がありますし、私もPhotoShopはあまり詳しくないので、これに関しては
何かわかりましたら、後日改めてコメントいたします。
それぞれのフォルダに入っている画像数は皆同じです。
フォルダに入っている画像の名前も、全フォルダ一緒であります。
(最初の画像から001.jpg 002.jpg 003.jpg ・・・・となっています。)
この加工前の画像をプログラムして加工しても(001.jpg 002.jpg 003.jpg・・・)と順番に同じ名前になるようにしたいです。
(加工後写真フォルダ1も加工後写真フォルダ2も加工後写真フォルダ3も全て入っているjpgファイルの名前は同じにします。)
001.jpg から始まるようにしたいです。。
3枚目の写真を作成する際ですが、
加工前の写真フォルダ3は写真の左上に、加工前写真フォルダ4は右上へ、加工前写真フォルダ5は左下へ、加工前写真フォルダ6は右下へ持っていき、写真フォルダ3の名前を加工後写真の名前にします(名前はどの写真も一緒なのであまり意味はないですが・・・)。
説明不足で申し訳ありません。。
よろしくお願いいたします。
固定してしまっても問題ないでしょうか。
お手数をおかけしますがよろしくお願いいたします。
今回はスクリプトでの対応をご希望で、それはそれで有用なケースも多いのですが、
munyaX さんが紹介されたようにコマンドを利用すると便利なケースもあります。
画質に差が出るケースもありますが、処理に関しては高速な処理が可能だとおもいます。
余裕があれば、試してみてはいかがでしょうか。
バッチにしておけば、アプリケーションを操作する手間も軽減できます。