ただの備忘記録

忘れないように記録を残します。忘れるから記録に残してます。そして、その記録が役立つといいかな。

【JSX】Photoshopでデータの変換(データ形式、解像度)

2020年05月14日 | JavaScript

Photoshop用スクリプトを公開します。
以下の5つのファイルが入っています。(拡張子は.jsx)

①sh_PNG→JPEG変換
 PNGファイルをJPEGファイルに変換します。(フォルダを指定してまとめて処理できます)

②sh_PSD→JPEG変換
 PSDファイルをJPEGファイルに変換します。(フォルダを指定してまとめて処理できます)
 中のスクリプトは①と同じで、設定を変更しています。

③sh_PSD一括ファイル変換
 PSDファイルを他の形式(PSD, JPEG, PNG, BMP, TIFF, PDF)、サイズ(解像度を指定)、階調を変換して出力します。(フォルダを指定してまとめて処理できます)
 出力先はフォルダを作成しますので、データを上書きする心配はありません。フォルダ名は出力設定によって変わりますので、設定が異なる出力を連続で作業してもフォルダが変わるので安心です。

④sh_開いた画像を順次印刷
 開いている画像を開いた逆順に印刷します。(ファイルの並び順ではなく、読み込みが終わった最後のデータから印刷します。印刷設定に対応していないので、事前に印刷した設定を引き継いで印刷します)
 設定をうまく拾えない可能性もあるため、1枚ずつ確認しながら印刷するようになっています。

⑤sh_中心線表示
 新しいレイヤーを作成し、画像の中心に線を引きます。

※Photoshop CS5で動作検証していたため、最新のPhotoshopでは動かない可能性があります。

※フォルダを指定できるスクリプトは、ファイルを開いていない状態でスクリプトを起動するとフォルダの選択ダイアログが表示されます。
ファイルを開いている場合は、スクリプトを起動したときにアクティブなファイルと同じフォルダを自動的に選択します。

【ダウンロード】

http://www.shurey.com/js/jsx/sh_photoshop_script5.zip

上記リンクからファイルをダウンロードしてください。
解凍すると5つのスクリプトファイルが入っています。
スクリプトファイルは拡張子がjsxですが、テキストファイルですので動作の内容を確認して安全性を検証していただけます。

【使い方の手順】

Photoshop内のScriptフォルダにダウンロードしたファイルを入れてください。
Photoshopはその後で起動します。

スクリプトファイルの置き場所や呼び出し方は以下のページを参考にしてください。
Photoshopのバージョンによって多少の違いがあると思いますので他のサイトを参照してください。

https://tech.drecom.co.jp/photoshop_automation_script/

※環境によってはスクリプトファイルをダブルクリックすると、フォトショップが起動してスクリプトが動作する場合があります。

【免責事項】

以前、漫画のアシスタントをしていたときに作成したスクリプトですので、現在は動作の検証をすることができません。手持ちのスクリプトから一般化されたものを詰め合わせにしていますので、使えない物があってもご容赦ください。
改変して使っていただくのもご自由になさってください。


【JSX】Photoshopのスクリプトで気付いたこと

2019年09月18日 | JavaScript

業務でWindowsのPhotoshopでスクリプトを作成して使用しています。

検索しても直接的な解決策がなかったため自己対応していますが、解決できないこともあるため情報共有のため記録しておきます。

①フォルダに入っているPSDファイルを取得する

ファイルを取得したときに実際のファイル数と取得したファイル数が異なる事態が発生しました。
以下、フォルダを選択肢、PSDファイルを取得して処理をするというスクリプトの一部です。


//ファイルダイアログを開く
folderObj = Folder.selectDialog("フォルダを選択してください。");
	if (folderObj) {
		//ファイルを取得
		fileList = folderObj.getFiles("*.psd");
		・・・
	}

ファイルを取得した後の処理中にエラーが出たので、ファイル取得時のfileList.lengthを調べてみると、フォルダに入っているファイルより値が多くなっていました。
fileList.nameを1つ1つ調べると、ファイル名の頭に「._」があるファイルが入っていることが分かりました。
それらは隠しファイルでした。表示の設定で隠しファイルをオンにすると下の様に確認することができました。

調べて見ると、ファイル名の頭に「._」と付いている隠しファイルは、Macで作業したときにできるファイルのようです。

下記のようにファイル名を除去するスクリプトを付け加えることで問題は解決できました。


//ファイルダイアログを開く
folderObj = Folder.selectDialog("フォルダを選択してください。");
	if (folderObj) {
		//ファイルを取得
		fileList = folderObj.getFiles("*.psd");

		//特定のファイル名を除去
		for (n=fileList.length; n>0; n--) {
			if (fileList[n-1].name.indexOf("._") == 0) {
				fileList.splice(n-1,1);
			}
		}
	}

②フォルダ名、ファイル名に「&」や「'」がある場合

こちらは完全には未解決です。

使用しているスクリプトは、指定のフォルダ内にあるファイルに対し任意の処理をして、別のフォルダに保存するというものです。
スクリプトを実行すると最初にダイアログを表示して、データの処理方法を選択します。そのダイアログの中にフォルダ名やファイル名の表示箇所があります。
下の図はファイルの入ったフォルダの内容です。

下図は、上記フォルダをスクリプトで選択し、ダイアログにフォルダ名とファイル名を表示しています。
フォルダが「HY」に、開始ファイル名が「HY01.psd」、終了ファイル名が「HY04.psd」と表示されており、元のフォルダ名やファイル名と比べると「&」が消えてしまっています。

以下、ダイアログを生成するスクリプトの一部です。


//フォルダ名をデコード
pathName = decodeURIComponent(folderObj.name);
//ファイル名をデコード
stFile = decodeURIComponent(fileList[stPage-1].name);
edFile = decodeURIComponent(fileList[edPage-1].name);

//ダイアログ
function createDialog(){
	var rs = "dialog { text:'PSD一括ファイル変換処理', bounds:[0, 0, 280, 330], ";
    
	rs += " pnl1: Panel { text:'フォルダ情報', bounds:[15, 10, 260, 130], ";
	rs += " str: StaticText { text:'フォルダ:', bounds:[10, 20, 90, 40],  }, ";
	//フォルダ名表示
	rs += " str: StaticText { text:'" + pathName + "', bounds:[60, 20, 240, 40],  }, ";
	rs += " str: StaticText { text:'開始:', bounds:[20, 50, 90, 70],  }, ";
	rs += " start_page: EditText { bounds:[60, 50, 100, 70],  }, ";
	//ファイル名表示
	rs += " start_file: StaticText { text:'" + stFile + "', bounds:[110, 50, 240, 70],  }, ";
	rs += " str: StaticText { text:'終了:', bounds:[20, 80, 90, 100],  }, ";
	rs += " end_page: EditText { bounds:[60, 80, 100, 100],  }, "; //textfiled
	//ファイル名表示
	rs += " end_file: StaticText { text:'" + edFile + "', bounds:[110, 80, 240, 100],  }, ";
	rs += " }," ;
	・・・
	rs += " cancel: Button { text:'キャンセル', bounds:[50, 290, 120, 320],  }, ";
	rs += " running: Button { text:'実行', bounds:[160, 290, 230, 320],  }, ";
	rs += " }";

	var dlg = new Window(rs);
	dlg.center();
	return dlg;
}

変数pathNmaeやstFile、edFileにはデコードされたパス名、ファイル名が入っています。
フォルダやファイルを作成する処理には問題がないため、ダイアログへ文字列として出力する段階で問題が発生していると考えられます。

変数rsにダイアログのデザイン的な情報を含めて、文字列で記述しています。

半角文字の「&」は表示されません。(このブログも半角のアンパサンドが使えないため全角で表示しています)
HTMLの表示のルールでも&を文字列で使用するには、コード表記の&に置き換えるようにと定められています。
「&」や「%26」「\&」などに置き換えてみましたが、&以外の文字列がそのまま表示されるだけでした。
現時点では全角文字の「&」を使用しています。

以下はフォルダ名「H&Y's」を表示した場合のテストで、文字を置き換えたパターン例です。「'」は全角で置き換えて表示しています。

&&
%26 &(全角) 

半角文字の「'」については、ダイアログを文字列(変数rs)で作成しているため、文字列の区切りとして認識されてダイアログを表示する前にエラーで止まります。
「'」「\'」の置き換えは失敗しています。
こちらも全角文字「’」で対応しています。

「"」はそもそもWindowsのファイル名には使えないため対処はしていません。

ダイアログの生成方法はこちらで公開されているファイルを参考にしました。
http://dearps.lovwar.com/2011/09/15/shape-3/

解決策をご存じの方の情報をお待ちしております。


【Photoshop JSX Script】アクティブドキュメントの順次印刷

2019年03月28日 | JavaScript

Photoshopで開いているドキュメントを順次印刷するためのスクリプトです。

スクリプトで印刷の設定ができないため、プリンタや用紙の設定などは先に済ませておいてください。
基本的にはアクティブになっているデータを「1部プリント」して、そのデータを閉じるだけのスクリプトです。
印刷の前にかならず確認のダイアログが表示されて一次停止します。
複数のファイルを開いている場合、次々にアクティブになったデータの印刷をクリック一つで繰り返すことができます。(各データに用紙設定がされていることが前提です)
確認のダイアログでは、データ名を表示し、印刷をするかどうか選択できます。「いいえ」を選ぶとスクリプトの処理を取り止めます。

【連続印刷ができないことのメモ】
当初は開いているファイルまたは指定したフォルダのデータを全て自動的に印刷するスクリプトを作ろうと考えました。
しかし、スクリプトの機能で対処できない部分がありました。
・スクリプトで印刷の設定ができない(基本的に1ページずつ確認しながら印刷しないとPhotoshopが正しく用紙設定できないことがあった)
・スクリプトにタイマー機能がない(タイマー機能の関数が使用できないため、印刷指示後に発生するタイムラグの調整ができなかった)
・緊急時に印刷の中止ができない(キー入力イベントを検知できなかったため)

~~~~~~~~~~

//アクティブドキュメントを順次印刷
#target photoshop

//ドキュメント数
var n = documents.length;
//真偽判定初期値
bool = false;

for (i=0; i < n; i++) {
    //印刷
    print_one() ;
    //中止
    if (! bool) {break;}
}

function print_one() {
    //アクティブドキュメントを取得
    var doc = activeDocument;
    //確認ダイアログ
    bool = confirm("印刷を開始します。\n" + doc.name);
    if (bool) {
        doc.printOneCopy(); //1枚印刷
        doc.close(SaveOptions.DONOTSAVECHANGES); //ファイルを閉じる
    }
}


【Photoshop JSX Script】ファイル名の文字化け対策

2018年03月03日 | JavaScript

Photoshopで、開いているファイルの名前を、新規レイヤーの名前にするスクリプト

~~~~~ここから~~~~~
//ファイル名取得
var doc = activeDocument;
var docName = doc.name;
docName = docName.substring(0,docName.lastIndexOf(".")); //拡張子除去
docName = decodeURIComponent(docName); //文字化け対策

//レイヤー構成の取得
var layerObj = doc.artLayers;

// レイヤーの追加
var newLayer = layerObj.add();
layerObj[0].name = docName; //ファイル名をレイヤー名に
~~~~~ここまで~~~~~

ファイル名の文字化けに悩んでいたところ
パス名に日本語が含まれている場合、ファイル名が文字化けするので文字化け対策が必要だと分かった。

★レイヤー名の変更について

var newLayer = layerObj.add(); // 新規レイヤーを追加
newLayer.kind = LayerKind.TEXT; // レイヤー種別をテキストレイヤーに設定
newLayer.name = docName;

だとエラーが出ない。

var newLayer = layerObj.add(); // 新規レイヤーを追加
newLayer.kind = LayerKind.NORMAL;
newLayer.name = docName;

だとエラーが発生。


【Photoshop JSX Script】ファイル情報の表示

2017年06月01日 | JavaScript

【基本機能】

Photoshopでファイルを開いている時に実行するとファイル名を取得し、現在時間を表示します。
それらを画面上に表示することで、処理時にファイル名やデータの作成時間を表示させるのが目的です。

ファイルの解像度を表示したり、自動的にレイヤー統合や上書保存も可能です。

↑作者名(任意に設定)と解像度(横×縦)
 
↑作者名とファイル名、現在の日付と時刻

【使い方】

ソース部分をコピーして、テキストエディタで保存します。
ファイルの拡張子は、jsxにします。
scriptフォルダに入れると、Photoshopのスクリプトメニューに表示されます。

名前を付けて保存したファイルを開いて表示(アクティブ)している状態でスクリプトを使用します。

【ソース】

//情報レイヤーの追加
#target photoshop

///// 初期設定 /////
//作者名
auther = "作者名";

//メインルーチン
defUnit = preferences.rulerUnits; //現在の単位設定を記録
    getInfo();
preferences.rulerUnits = defUnit; //元の単位に戻す

function getInfo() {
    //アクティブドキュメントを取得
    var doc = activeDocument;
 
    //パス取得
    var docPath = doc.fullName.fsName.toString();
    docPath = docPath.substring(0,docPath.lastIndexOf("\\")+1); //パス名

    //ファイル名取得
    var docName = doc.name;
    docName = docName.substring(0,docName.lastIndexOf(".")); //拡張子除去

    //ページサイズ取得
    preferences.rulerUnits = Units.PIXELS; //単位ピクセル
    //preferences.rulerUnits = Units.MM; //単位mm
    var doc_h = doc.height.value;
    var doc_w = doc.width.value;

    //データ情報の出力(見開き除外)
    var dateObj = new Date();
    var year = dateObj.getFullYear();
    var month = dateObj.getMonth() + 1;
    var date = dateObj.getDate();
    var hour = dateObj.getHours();
    if (hour < 10) hour = "0" + hour;
    var min = dateObj.getMinutes();
    if (min < 10) min = "0" + min;
    var timeStr = year + "/" + month + "/" + date + " " + hour + ":" + min; //日時
    
    //出力データ
    var text = "[" + auther + "] " + doc_w  + " x " + doc_h; //解像度
    //var text = "[" + auther + "] " + docName + " (" + timeStr + ") "; //ファイル名と時間

    var newLayer = doc.artLayers.add(); // 新規レイヤーを追加
    newLayer.kind = LayerKind.TEXT; // レイヤー種別をテキストレイヤーに設定
    newLayer.textItem.contents = text // テキストレイヤーに文字列を設定
    newLayer.name = "[INFO]"; //レイヤー名
    
    //表示位置
    preferences.rulerUnits = Units.MM; //単位mm
    var x = 20; //left
    var y = 10; //top
    newLayer.textItem.position = [x, y]; // レイヤー位置を指定
    newLayer.textItem.font = "MS-Gothic"; // フォント名
    newLayer.textItem.size = 10; // フォントサイズ
    newLayer.textItem.antiAliasMethod.NONE; //アンチエイリアス
    //newLayer.textItem.justification.CENTER; //行揃え
    
    //レイヤー統合
    //doc.flatten();
    
    //上書き保存
    //doc.save();
}

【Photoshop JSX Script】一括印刷

2015年09月06日 | JavaScript

【基本機能】

Photoshopで開いている画像を連続して印刷します。

フォルダを選択して一括印刷にしなかったのは、何度かテストをしてみたところ、用紙設定を正しく設定することができませんでした。
用紙設定をした後、Ctrl+Alt+Shift+Pで印刷するという操作を繰り返していたので、用紙設定後に使える部分だけスクリプトにしてみました。

開かれた画像の枚数分、印刷を繰り返すだけのスクリプトです。印刷した画像は保存せずに閉じてしまいます。

【使い方】

ソース部分をコピーして、テキストエディタで保存します。
ファイルの拡張子は、jsxにします。
scriptフォルダに入れると、Photoshopのスクリプトメニューに表示されます。

【ソース】

//開いた画像を一括印刷

n = documents.length;

for (i=0; i < n; i++) {
    activeDocument.printOneCopy();
    activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}


【Photoshop JSX Script】ファイル変換

2015年05月08日 | JavaScript

【基本機能】
Photoshopのスクリプトを使って、フォルダ内のファイルを一括変換します。

読み込めるファイル(変換前のファイル)はフォルダ内の全ファイル、もしくは拡張子で指定したファイルに制限することができます。
出力設定はpsd、jpg、pngの3形式に対応しています。

【スクリプトの準備】

ソースに記述したスクリプトをテキストファイルに貼り付け、ファイル名を「ファイル変換.jsx」として保存します。
「psd→jpg変換.jsx」としても分かりやすいです。拡張子さえ変更しなければ、ファイル名は自由に付けてください。
Photoshopが入っていないと起動しません。

【起動方法】
その1:スクリプトを呼び出してから開くダイアログでフォルダを選択します。
その2:処理したいフォルダにあるファイルを1つ開いてからスクリプトを実行すると、そのフォルダを選択したことになります。

【設定変更】
現在はPSD形式からJPEG形式への変換設定になっています。
fe1とfe2を変更することで処理ファイルの対象を変更できます。その他、出力の細かな設定は「保存オプションの設定」で行ってください。

【ソース】

//ファイル変換
#target photoshop

//設定項目(psd,jpg,png)
fileExp = new Array("*","psd","jpg","png");
fe1 = 1; //変換前の拡張子
fe2 = 2; //変換後の拡張子

//保存オプションの設定
if (fe2 == 1) {
    //PSD
    var saveOpt = new PhotoshopSaveOptions;
    saveOpt.alphaChannels = true; //αチャンネルを保存
    saveOpt.annotations = true; //注釈
    saveOpt.embedColorProfile = true; //カラープロファイルを保存
    saveOpt.layers = true; //レイヤー保存
    saveOpt.spotColors = true; //スポットカラー保存
} else if (fe2 == 2) {
    //JPEG
    var saveOpt = new JPEGSaveOptions();
    saveOpt.embedColorProfile = true; //カラープロファイルを保存
    saveOpt.quality = 10; //品質:0~12(12が最高画質)
    saveOpt.formatOptions = FormatOptions.STANDARDBASELINE //ベースライン(標準)
    //saveOpt.formatOptions = FormatOptions.OPTIMIZEDBASELINE; //ベースライン(最適化)
    //saveOpt.formatOptions = FormatOptions.PROGRESSIVE; //プログレッシブ
    //saveOpt.scans = 3; //プログレッシブ時のスキャン数:3~5
    saveOpt.matte = MatteType.NONE;
} else if (fe2 == 3) {
    //PNG
    saveOpt = new PNGSaveOptions();
    saveOpt.interlaced = false; //インターレース
}

selFolder();

//フォルダを選択
function selFolder() {
    var n = documents.length; //開いているデータの数
    if (n > 0) {
        //アクティブドキュメントのパスを取得
        var folderPath = activeDocument.path;
        var folderObj = new Folder(folderPath);
    } else {
        //ダイアログの表示
        var folderObj = Folder.selectDialog("フォルダを選択してください。");
    }

    //フォルダの確認
    if (folderObj) {
        //全てのファイル
        fileList = folderObj.getFiles("*." + fileExp[fe1]); //ファイルはアルファベット順になっている
        //alert(fileList.length+"個のファイルがあります");
        
        //フォルダ名をデコード
        pathName = decodeURIComponent(folderObj.name);
        
        //ファイル数の取得
        edPage = fileList.length;
        
        //ファイル数の確認
        if (edPage > 0) {
            //開始ファイルと終了ファイル
            stPage = 1;
            stFile = decodeURI(fileList[stPage-1].name);
            edFile = decodeURI(fileList[edPage-1].name);
        
            //ダイアログ初期化
            var newDialog = new createDialog_DLG();
            initializeBuilder(newDialog);

            //処理したファイル名のリスト
            text_fileNames = "";

            //ダイアログ表示
            if(runBuilder(newDialog)){
                with(newDialog){
                    //ページ番号取得
                    //stPage = parseInt(pnl.start_page.text,10);
                    //edPage =parseInt(pnl.end_page.text,10);
                }
        
                for (var i=stPage-1; i < fileList.length; i++) {
                    var doc = fileList[i];
                    //ファイルを開く
                    open(doc);
                    //カラーモード確認
                    fileConvert(doc);
                }
            }

            //結果報告
            if (text_fileNames != "") {
                alert(text_fileNames);
            }
        } else {
            alert("処理対象のファイルが見つかりません。");
        }
    }
}

//ダイアログ(一括変換処理)
function createDialog_DLG(){
    var dialogResource = "dialog { text:'一括変換処理', bounds:[0, 0, 260, 200], ";
    dialogResource += " pnl: Panel { text:'フォルダ情報', bounds:[15, 8, 245, 136], ";
    dialogResource += " str: StaticText { text:'フォルダ:', bounds:[10, 23, 90, 36],  }, ";
    dialogResource += " str: StaticText { text:'" + pathName + "', bounds:[60, 23, 220, 41],  }, ";
    dialogResource += " start_file: StaticText { text:'" + stFile + "', bounds:[110, 57, 220, 70],  }, ";
    dialogResource += " str: StaticText { text:'開始:', bounds:[20, 57, 90, 70],  }, ";
    dialogResource += " start_page: EditText { bounds:[60, 57, 100, 75],  }, ";
    dialogResource += " end_file: StaticText { text:'" + edFile + "', bounds:[110, 90, 220, 103],  }, ";
    dialogResource += " str: StaticText { text:'終了:', bounds:[20, 90, 90, 103],  }, ";
    dialogResource += " end_page: EditText { bounds:[60, 90, 100, 108],  }, ";
    dialogResource += " }," ;
    dialogResource += " cancel: Button { text:'キャンセル', bounds:[50, 158, 112, 182],  }, ";
    dialogResource += " running: Button { text:'実行', bounds:[150, 158, 212, 182],  }, ";
    dialogResource += " }";

    var dlg = new Window( dialogResource );
    dlg.center();
    return dlg;
}
// ダイアログ(動作設定)=============================
function initializeBuilder(builder){
    with(builder){
        //ページ番号チェック
        function pageCheck() {
            stPage = parseInt(pnl.start_page.text,10)
            edPage = parseInt(pnl.end_page.text,10);
            //数値以外の場合
            if (isNaN(stPage)) {stPage = 1;}
            if (isNaN(edPage)) {edPage = fileList.length;}
            //大小が逆の場合、入れ替え
            if (stPage > edPage) {
                var n = stPage;
                stPage = edPage;
                edPage = n;
            }
            //最小値と最大値
            if (stPage < 1) {stPage = 1;}
            if (edPage > fileList.length) {edPage = fileList.length;}
            //表示変更
            pnl.start_page.text = stPage;
            pnl.end_page.text = edPage;
            pnl.start_file.text = decodeURI(fileList[stPage-1].name);
            pnl.end_file.text = decodeURI(fileList[edPage-1].name);
        }
    
        //初期値
        pnl.start_page.text = stPage;
        pnl.end_page.text = edPage;
        
        //ボタンイベント
        cancel.onClick = function(){ this.parent.close( false ); };
        running.onClick = function(){ this.parent.close( true ); };
        //ファイル名変更
        pnl.start_page.onChange = function() {pageCheck();};
        pnl.end_page.onChange = function() {pageCheck();};
    }
}

// ダイアログ(起動・実行)===================================================
function runBuilder(builder){
  return builder.show();
}

function fileConvert(builder) {
    //アクティブドキュメントを取得
    var doc = activeDocument;
 
    //パス取得
    var docPath = doc.fullName.fsName.toString();
    docPath = docPath.substring(0,docPath.lastIndexOf("\\")+1);
    //alert(docPath);

    //ファイル名取得
    var docOldName = doc.name;
    var docName = docOldName.substring(0,docOldName.lastIndexOf("."));
    
    //元データが2階調の場合
    if ((fe2 == 1) || (fe2 == 2)) {
        if (doc.mode == DocumentMode.BITMAP) {
            doc.changeMode(ChangeMode.GRAYSCALE);
        }
    }

    //別名保存の設定
    var docNewName = docName + "." + fileExp[fe2]
    var saveFileObj = new File(docPath + docNewName);
    
    //別名で保存
    try {
        activeDocument.saveAs(saveFileObj, saveOpt, true, Extension.LOWERCASE);
        //記録
        text_fileNames += docOldName + " → " + docNewName + "\n";
        //ファイルを閉じる
        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    } catch(msg) {
        alert(msg + " Can't save it.");
    }
}


【Photoshop JSX Script】ページ番号のテキスト化と振り分け

2015年04月16日 | JavaScript

Photoshop CS5用に作成したスクリプトです。他のバージョンでは動作確認していません。

使い方はAdobeのページをご覧ください。

・ファイル名から数字を抜き出し、それをページ番号とします。
・ページ番号をテキストレイヤーで表示します。
・ページが奇数か偶数かによって表示位置を変更することができます。

ファイル名や用紙のサイズに合わせて初期値による設定が必要です。初期値を参照してください。
・ファイル名のどこからどこまでがページ番号として必要か、取得する位置を指定します。
・ページ番号の表示位置は用紙のサイズに合わせて変更が必要です。単位はmmです。

~~~~~~~~~~以下スクリプト~~~~~~~~~~

//ページ番号をファイル名から取得するスクリプト
var defUnit = preferences.rulerUnits;
//preferences.rulerUnits = Units.PIXELS; //単位設定(ピクセル)
preferences.rulerUnits = Units.MM; //単位設定(mm)
setPageNumber();
preferences.rulerUnits = defUnit;

function setPageNumber() {
    //ファイル名を取得
    var doc = activeDocument;
    var docName = doc.name;
    
    //初期値
    //ページ番号をファイル名から取得する位置
    //例:xx00.psdの場合(3文字目から4文字目→開始位置=3、終了位置=4)
    //例:x000x.psdの場合(2文字目から4文字目→開始位置=2、終了位置=4)
    var st = 2; //開始位置
    var ed = 5; //終了位置
    //表示位置(単位に従う)
    var posX = 130; //左からの位置
    var posY = 360; //上からの位置
    //var posX = doc.width / 2; //ページの中央
    //var posY = doc.height / 2; //ページの中央
    //ページの振り分けをする場合の表示位置(不要な場合は同じ数値にする)
    var posX0 = 225; //偶数ページ(右ページ)
    var posX1 = 10; //奇数ページ(左ページ)

    //ページ番号を取得
    var pageS = docName.substring(st-1,ed); //文字列
    var pageN = parseInt(pageS,10); //数値化
    
    //ページの振り分けをする場合の表示位置
    if (posX0 != posX1) {
        if ((pageN % 2) == 0) {
            posX = posX0; //偶数ページ
        } else {
            posX = posX1; //奇数ページ
        }
    }
    
    //レイヤーを取得
    var layerObj = doc.artLayers;
    
    //ページ番号のレイヤー作成
    var newLayer = layerObj.add(); // 新規レイヤーを追加
    newLayer.kind = LayerKind.TEXT; // レイヤー種別をテキストレイヤーに設定
    newLayer.textItem.contents = "- " + pageS + " -"; // テキストレイヤーに表示する文字列
    newLayer.textItem.position = Array(posX, posY); // レイヤー位置を指定(配列)
    newLayer.textItem.font = "MS-Gothic"; // フォント名
    newLayer.textItem.size = 14; // フォントサイズ
    newLayer.textItem.antiAliasMethod.NONE; //アンチエイリアス
    newLayer.textItem.justification.CENTER; //行揃え
}


【Photoshop JSX Script】ファイル番号、二階調化、解像度変更、保存

2015年03月27日 | JavaScript

Photoshopのスクリプトを初めてやってみました。
JavaScriptを母体にしていることは知っていましたが、まさか使うことになるとは思ってもいませんでした。

スクリプトの目的は、ファイル名からページ番号を抜き取って画面内にテキストレイヤーとしてページ番号を表示し、データを二階調化して、解像度を変更、最後にページ番号を付けたファイル名を作り直して保存します。

色々と調べながら散見する情報を集めて作ってみました。
その中で非常に分かりずらかった二階調化の処理方法について書き残しておきます。

~~~~~~~~~~以下スクリプト~~~~~~~~~~

var defUnit = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS; //単位をpixelに設定
setPageNumber();
preferences.rulerUnits = defUnit;

function setPageNumber() {
    //アクティブドキュメントを取得
    var doc = activeDocument;
 
    //パス取得
    var d_path = activeDocument.fullName.fsName.toString();
    d_path = d_path.substring(0,d_path.lastIndexOf("\\")+1);

    //ファイル名取得
    var d_name = doc.name;

    //ページ番号(ファイル名から切り出し)
    var page = d_name.substring(1,5);

    //レイヤー取得
    var layerObj = doc.artLayers;
   
    //ページ番号のレイヤー作成
    var newLayer = layerObj.add(); // 新規レイヤーを追加
    newLayer.kind = LayerKind.TEXT; // レイヤー種別をテキストレイヤーに設定
    newLayer.textItem.contents ="No." + page; // テキストレイヤーに文字列を設定
    newLayer.textItem.position = [0, 0]; // 座標を指定(pixel)
    newLayer.textItem.font = "MS Gothic"; // フォント名。
    newLayer.textItem.size = 14; // フォントサイズ。

    //二階調化
    doc.flatten(); //統合
    doc.changeMode(ChangeMode.GRAYSCALE); //カラーの場合、一旦グレーにする

    var bitSaveOptions = new BitmapConversionOptions();
    bitSaveOptions .method = BitmapConversionType.HALFTONESCREEN; //ハーフトーン
    bitSaveOptions .angle = 45; //角度
    bitSaveOptions .frequency = 60; //線数
    bitSaveOptions .resolution = 600; //解像度(変更可)
    bitSaveOptions .shape = BitmapHalfToneType.ROUND; //円

    doc.changeMode(ChangeMode.BITMAP, bitSaveOptions ); //白黒2bit

    //別名保存の設定
    saveFileObj = new File(d_path + "xx" + page); //保存ファイル名
    psdSaveOpt = new PhotoshopSaveOptions;
    psdSaveOpt.alphaChannels = true;
    psdSaveOpt.annotations = true;
    psdSaveOpt.embedColorProfile = true;
    psdSaveOpt.layers = true;
    psdSaveOpt.spotColors = true;

    //保存する
    try {
        activeDocument.saveAs(saveFileObj,psdSaveOpt,false,Extension.LOWERCASE);
    } catch(msg) {
        alert(msg + " 保存できませんでした");
    }
}

【注意点】

「preferences.rulerUnits」を使って単位を指定しないと、設定の単位に影響されてスクリプト内の数値も単位が変わってしまいます。
解像度は二階調化と同時に設定していますので、変更がある場合は、二階調化の中で行います。


【JS】NHK大河ドラマ「軍師官兵衛」人物年齢表

2014年01月25日 | JavaScript

今回もNHKの大河ドラマに合わせて人物年齢表を作成しました。

大河ドラマ「軍師官兵衛」人物年齢表

各登場人物の生年月日と没年月日からグラフを作って表示していますので、番組中にその年代の年齢を確認することができます。
Wikipediaにもリンクがありますので事前・事後の学習にも使えます。

スクリプトは公開していますので、オリジナル年表を作ることも可能です。