« 2011年9月 | メイン | 2011年11月 »

●Photoshopでグループ毎にJPEG出力する

2011年10月16日    

Twitter上でグループ毎に画像を出力できるスクリプトはないものか
という話題が出てたので作ってみました。
Photoshop用javascriptなのでWin/Mac両対応です
これ自体は使いどころが限られるスクリプトですが 何かの参考に置いておきます

実行するとフォルダ選択ダイアログが出るので その指定したフォルダに
1階層目にあるグループを一つ一つ順に出力してJPEG画像で出力します
ファイル名はレイヤ名を使い、重複が有る場合は末尾に数字を付加するようにしてあります。

#target photoshop

//配列内にobjがあるかをチェック
function check_array(target_array,obj){
    for (var i in target_array){
        if (target_array[i] == obj){
            return true;
            break;
            }
    }
    return false;
 }

//名前の重複を調べて再割当て
function chack_name(array1,name1){
    if (! check_array(array1,name1)){
        return name1;
     }else{
         //序数
         var tag = 1;
         //同一名が100以上になることは考えない
         while (tag < 100){
            var name2 = name1 + "_" + tag;
            if (! check_array(array1,name2)){
                return name2;
            }
            tag += 1;
        }
    }
}

//JPEGで保存
function save_JPG(file_path){
    jpgFile = new File(file_path);
    jpgSaveOptions = new JPEGSaveOptions();
    jpgSaveOptions.embedColorProfile = true;
    jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
    jpgSaveOptions.matte = MatteType.NONE;
    jpgSaveOptions.quality = 1;
    app.activeDocument.saveAs(jpgFile, jpgSaveOptions, true,Extension.LOWERCASE);
}

//main
// in case we double clicked the file
app.bringToFront();
app.displayDialogs = DialogModes.NO;
//ドキュメントが開かれているかどうか判別
if (app.documents.length ==0)
{
	//ドキュメントが開かれていない場合処理なし
}
else
{ 
    //Folder.selectDialog ([prompt])  :出力先を指定
    var outputDir = Folder.selectDialog (["Plese select output directory"]);
    //選択されてない場合はnullが返る
    //alert(outputDir );
    if (outputDir != null){
        //作業するドキュメントを取得
        var active_doc = activeDocument;
        try {
            //ルート階層にあるレイヤーセットを取得
            var docLayerSets= activeDocument.layerSets;
            //ルート階層にある全てのレイヤーを取得
            var docArtLyaers= activeDocument.layers;
            var docArtLyaerCount = docArtLyaers.length
            //レイヤの表示状態を退避する配列を作成
            layer_v_array = new Array(docArtLyaerCount);
            //全てのレイヤーの表示状態を取得して非表意に
            for (i = 0; i < docArtLyaerCount; i++){
                //表示状態の取得
                layer_v_array[i] = docArtLyaers[i] .visible;
                //非表示に
                docArtLyaers[i] .visible = false;
            }
            //ファイル名の重複チェックのための配列
            name_array = new Array(docLayerSets.length);
            //グループの書き出し
            for (i = 0; i < docLayerSets.length; i++){
                //レイヤを表示
                docLayerSets[i].visible = true;
                //レイヤ名の取得
                layer_name = docLayerSets[i].name;
                //ファイル名の重複がないか処理
                layer_name = chack_name(name_array,layer_name);
                //名前のリストに追加
                name_array[i] = layer_name;
                //ファイルパスの生成
                var file_path = outputDir  + "/" + layer_name + ".jpg";
                //alert(file_path);
                //ファイルの書き出し
                save_JPG(file_path);
                //対象レイヤーを非表示に
                docLayerSets[i].visible = false;
            }
            //レイヤの表示を元の様態に戻す
            for (i = 0; i < docArtLyaerCount; i++){
                //表示状態の取得
                docArtLyaers[i] .visible = layer_v_array[i];
            }
        } catch (e) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert(e);
            }
    	//return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        }
    }
}


使い方や他のスクリプト類はこちら を参照してください
http://yukimi.moemoe.gr.jp/MT/archives/photoshop/