【1000pt質問】


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 に関してのアドバイスでもかまいません。

お手数をおかけしますが、どうぞよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/01/10 22:39:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント100pt

一応複数ファイルに対応してみました。

// 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" );
id:aiomock

ご回答ありがとうございます。

2009/01/10 03:38:33

その他の回答2件)

id:niwa-mikiho No.1

回答回数516ベストアンサー獲得回数40

ポイント27pt

画質に強力なこだわりを持っていなければ、Perl+GD や PHP+GD などプログラミング言語を使うのはどうでしょう?

id:aiomock

ご回答ありがとうございます。

+GDというプログラム言語があることは知りませんでした。

検討してみます。

2009/01/05 20:55:44
id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント100pt

PhotoShop のスクリプトは以前から興味があったのですが、

今回の質問が面白そうでしたので、これを機会に使ってみました。


一応、下記のスクリプトでご希望の処理になっていないでしょうか。

// Global define

// ★★★実際のパスに変更してください。
var rootFolder = "C:/Documents and Settings/aiomock/デスクトップ/adobe script/";
var cPic;
var srcFileObj;
var dstFileObj;

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, fClose ) {
    var folderObj = Folder(rootFolder + srcFolder   );
     fileList = folderObj.getFiles();
    if( fileList.length  >= 1 ) {
        srcFileObj = new File( fileList[0].fsName );
        var dFilePath = fileList[0].fsName.replace( srcFolder, dstFolder );
        dstFileObj = new File( dFilePath );
        srcFileObj.copy( dstFileObj );
        cPic = open(dstFileObj);

         preferences.rulerUnits = Units.PIXELS;
        cPic.activeLayer.applySharpen();
        cPic.resizeImage(600,450);
        cPic.saveAs(dstFileObj, jpegOpt, true, Extension.LOWERCASE);
        if( fClose == true ) {
            cPic.close(SaveOptions.DONOTSAVECHANGES);
        }
    }
}

//  画像結合関数
function addImage( srcFolder, xPos, yPos ) {
    var selRegion = Array( Array(0, 0), Array(1, 0), Array(1, 1), Array(0, 1), Array(0, 0));
    var folderObj = Folder(rootFolder + srcFolder   );
     fileList = folderObj.getFiles();

    if( fileList.length  >= 1 ) {
        srcFileObj = new File(fileList[0].fsName);
        var addPic = open( srcFileObj );
        addPic.activeLayer.applySharpen();
        addPic.resizeImage( 300, 225 );
        addPic.activeLayer.copy();
        activeDocument = cPic;
        cPic.selection.select( selRegion );
        cPic.paste();
        cPic.activeLayer.translate( xPos, yPos );
        addPic.close( SaveOptions.DONOTSAVECHANGES );
    }
    if( xPos != 0 && yPos != 0 ) {
        cPic.saveAs(dstFileObj, jpegOpt, true, Extension.LOWERCASE);
        cPic.close( SaveOptions.DONOTSAVECHANGES );
    }
}
// 変換処理
SizeConvert( "kakou_picture1", "kakougo_picture1" , true);
SizeConvert( "kakou_picture2", "kakougo_picture2" , true);
SizeConvert( "kakou_picture3", "kakougo_picture3", false );

addImage( "kakou_picture3", 0, 0);
addImage( "kakou_picture4", 300, 0);
addImage( "kakou_picture5", 0, 225);
addImage( "kakou_picture6", 300, 225);

http://www.openspc2.org/book/PhotoshopCS/

id:aiomock

ご回答ありがとうございます。試してみようかと思います。


エラーが発生してしまいました。

エラー 21:undefined がオブジェクトでありません。

ライン:66

→ cpic.saveAs(dstFileObj,jpegOop.true.Extension.LOWERCASE);

こちらはどのように対処すればよろしいでしょうか。

お手数をおかけしますがどうぞよろしくお願いいたします。

2009/01/08 18:55:49
id:Mook No.3

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

一応複数ファイルに対応してみました。

// 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" );
id:aiomock

ご回答ありがとうございます。

2009/01/10 03:38:33
  • id:munyaX
    「+GD」ではなく「GD」というライブラリです。
    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/
  • id:aiomock
    Mook さん

    実行してみたところエラーが発生しました。

    エラー 21:undefined がオブジェクトでありません。
    ライン:66

    → cpic.saveAs(dstFileObj,jpegOop.true.Extension.LOWERCASE);

    上記の様なメッセージを返されたのですが、どのように対処すればよろしいでしょうか。

    お手数をおかけしますがどうぞよろしくお願いいたします。

  • id:Mook
    うーん、このスクリプトをコピーして実行されたでしょうか?

    JavaScript は大文字小文字を認識しますので、もし仮にスクリプト中に
    cPic ではなく、cpic としていたら、当該のエラーになります。

    一応上記は PhotoShop CS4 Extended(評価版^^;;)で動作確認済みのものです。
    内容をそのままファイルにコピーし、aiomock.js などの名前で保存し、
    「ファイル」⇒「スクリプト」⇒「参照」でファイルを選択すれば、実行されると思いますが、
    そのように実行されているでしょうか。
    http://codezine.jp/article/detail/406?p=1
    (「参考:Photoshop CS2でのスクリプト」 の部分参照)


    お使いのバージョン情報等も提示いただいた方がよいかと思います。
  • id:aiomock
    実行してみましたが、動かすことができませんでした。

    ファイル名は photoshop.js

    で 頂いたスクリプトをそのままコピーして貼り付けを行いました。


    バージョンは同じくCS4の体験版を使用して行ってみましたが 同じエラーが発生します。

    スクリプトをアップしてみました。

    http://oskuni7.sakura.ne.jp/hatena/question6/photoshop.js

    またフォルダの中身もアップしてみました。

    http://oskuni7.sakura.ne.jp/hatena/question6/forudanai.jpg

    お手数をおかけしますがご確認をしていただいてよろしいでしょうか。申し訳ありません。
  • id:Mook
    読み込む際に、Altキーを押しながら読み込むとデバッグモードになるかと思います。
    デバッグウィンドウが起動したら、F11で1ステップずつ実行されると思いますが、
    エラーが出るまでの処理は問題なく動作しているでしょうか?

    エラーが出た際の状況(画面の状態、ファイルの状態)がどのようになっているかを
    ご報告ください。
  • id:aiomock
    Altキーを押しながらデバッグモードになり、その後実行しました。

    F11で1ステップずつ実行したのですが、画面は何も作業が行われていない状況です。

    最初のadobe scriptフォルダへのリンク指定が間違っているということでしょうか。(確認をして直接コピー&ペーストしたのですが・・)

    通常通り実行するとやはり

    66行目 cPic.saveAs(dstFileObj, jpegOpt, true, Extension.LOWERCASE);

    がエラーであると表示されてしまいます。




  • id:Mook
    あぁ、わかりました。
    パスの指定のせいだと思います。

    "C:¥...¥...¥..."(円マーク) は JavaScript では "C:¥¥...¥¥...¥¥..."
    のように一つの¥(実際は半角)を表すのに二つ続けて書きます
    (¥特殊な文字なのでそのままではだめなのです)。


    もしくは例のように
    "C:/.../.../..."
    としてください。

  • id:aiomock
    プログラム実行できました。

    ありがとうございます^^。

    後、最後にお聞きしたいのですが、このプログラムを実行するとフォルダに入っている最初の写真しか実行されませんでした。

    入っている写真をすべてプログラムどおり実行するにはどのようにすればよろしいのでしょうか?

    またテンプレート(PSD形式の)をあらかじめ用意しておいてその下に画像をおいていくという様なこともできるのでしょうか?
    (壁紙がいくつかあるのでその下に加工後写真を持っていきたいと考えています。)

    PSD形式(レイヤーの画像)の下にサイズ変更した画像(レイヤー)をおくという作業をやりたいと思うのですが、可能でしょうか?

    加工後写真1枚目、加工後写真2枚目、加工後写真3枚目の壁紙レイヤーをリンク指定で呼び込みたいと思っております。
    (リンク指定ですと壁紙も変更できるため。。)

    少し質問が多くなり申し訳ありませんが、お時間がありましたらよろしくお願いいたします。
  • id:Mook
    フォルダに複数の写真が入っていて、すべてを処理したいのですか。
    それは想定外でした。

    その場合、最初の二つのフォルダはよいのですが、3番目以降のフォルダに関しては
    それぞれのフォルダからどの4画像を組み合わせて、一枚にするのでしょうか。

    また、それぞれのフォルダに入っている画像数はみな同じ枚数なのですか。

    このあたりをご説明いただければ、対応できるかと思います。

    >またテンプレート(PSD形式の)をあらかじめ用意しておいてその下に画像をおいていくという様なこともできるのでしょうか?
    >(壁紙がいくつかあるのでその下に加工後写真を持っていきたいと考えています。)

    スクリプトでそのような処理をすることは可能かと思いますが、なさりたいことの仕様も
    わからない部分がありますし、私もPhotoShopはあまり詳しくないので、これに関しては
    何かわかりましたら、後日改めてコメントいたします。
  • id:aiomock
    ご回答ありがとうございます。

    それぞれのフォルダに入っている画像数は皆同じです。

    フォルダに入っている画像の名前も、全フォルダ一緒であります。
    (最初の画像から001.jpg 002.jpg 003.jpg ・・・・となっています。)

    この加工前の画像をプログラムして加工しても(001.jpg 002.jpg 003.jpg・・・)と順番に同じ名前になるようにしたいです。
    (加工後写真フォルダ1も加工後写真フォルダ2も加工後写真フォルダ3も全て入っているjpgファイルの名前は同じにします。)
    001.jpg から始まるようにしたいです。。

    3枚目の写真を作成する際ですが、

    加工前の写真フォルダ3は写真の左上に、加工前写真フォルダ4は右上へ、加工前写真フォルダ5は左下へ、加工前写真フォルダ6は右下へ持っていき、写真フォルダ3の名前を加工後写真の名前にします(名前はどの写真も一緒なのであまり意味はないですが・・・)。

    説明不足で申し訳ありません。。

    よろしくお願いいたします。

  • id:Mook
    であれば、処理の仕様を001.jpg からxxx.jpg(xxx は最後の数)までを処理するという仕様に
    固定してしまっても問題ないでしょうか。
  • id:aiomock
    はい、ぜんぜん大丈夫です。

    お手数をおかけしますがよろしくお願いいたします。
  • id:Mook
    いるか賞と、ポイント送信までいただきありがとうございます。

    今回はスクリプトでの対応をご希望で、それはそれで有用なケースも多いのですが、
    munyaX さんが紹介されたようにコマンドを利用すると便利なケースもあります。

    画質に差が出るケースもありますが、処理に関しては高速な処理が可能だとおもいます。
    余裕があれば、試してみてはいかがでしょうか。

    バッチにしておけば、アプリケーションを操作する手間も軽減できます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません