この記事は5年以上前の情報で、内容が古くなっている可能性があります。

PhotoShop JavaScript(ExtendScript)

PhotoShopで自動処理を行うための、JavaScript(ExtendScript)のメモです。

※ この記事は量が増えていったら分割するかもしれません。
※ Windows版 PhotoShop CS2でしか検証してないので、他のバージョンで動くかは不明。

ドキュメントの操作

ファイルパスを指定してドキュメントのオープン

//Windowsではパスの区切りは / スラッシュ。Unixっぽい指定。
//d:sampletest.phd → /d/sample/test.psd
var doc = app.open("/d/sample/test.psd");

現在アクティブになっているドキュメント取得

var doc = app.activeDocument;

イメージサイズの変更

//単位は既定の単位。たぶん
//横500 縦400
doc.resizeImage(500, 400);

キャンバスのサイズ変更

//単位は既定の単位。おそらく。
//横300 縦400 中央を基点
doc.resizeCanvas(300, 400, AnchorPosition.MIDDLECENTER);

レイヤーの操作

レイヤー追加

//アートレイヤー追加
        var newlayer = doc.artLayers.add();

レイヤーの取得

//インデックスで指定
var layer = doc.artLayers[0];
//レイヤー名で指定
var layer = doc.artLayers("layer name");

レイヤーの種類変更

//テキストレイヤーにする
newlayer.kind = LayerKind.TEXT;

レイヤースタイル設定

//スタイル名はPhotoShop側でスクリプト実行前にあらかじめ作っておく
newlayer.applyStyle("layer_style_name");

メタデータの設定

//ここで入れたデータは書類情報??プロパティ?に入る
        
//著者名
doc.info.author = "author name";

//所有者のURL
doc.info.ownerUrl = "http://www.exsample.com";

//著作権情報
doc.info.copyrighted = CopyrightedType.COPYRIGHTEDWORK;

テキストの操作

//レイヤー追加
//テキストレイヤーは空のレイヤーしか作れない
var newlayer = doc.artLayers.add();

//レイヤーの種類をテキストレイヤーに
newlayer.kind = LayerKind.TEXT;

//テキストアイテム取得
var ti = newlayer.textItem;

//テキストの内容
ti.contents = "テキスト内容";

//テキストカラー(RGBで指定。他のカラーモードの場合はそれように変更)
ti.color.rgb.red = 255;
ti.color.rgb.green = 100;
ti.color.rgb.blue = 100;

//フォント名の設定
//layer.textItem.fontで取得できるフォント名(Arial-BoldMT KozGoPro-Bold 等)
//文字ウィンドウで表示されるのと違うので注意
ti.font = "KozGoPro-Medium";

//アンチエイリアス
ti.antiAliasMethod = AntiAlias.SMOOTH;

//文字サイズ設定
//単位はポイントなので、他の単位で指定する場合は計算する
ti.size = 12;

//段落テキストか、一行テキストか
ti.kind = TextType.PARAGRAPHTEXT;

//テキストエリアサイズ指定
//単位はポイントなので、他の単位で指定する場合は計算する
ti.width = 300;
ti.height = 200;

//位置
//x:10 y:20
ti.position = new Array(10, 20);

//文字位置
ti.justification = Justification.CENTER;

//トラッキング(文字の離れ量指定)
ti.tracking = 150;

JPEG形式で保存する(メニューの ファイル→別名保存と同じ)

カラーチャンネルを変更する

//カラーチャンネルを8bitにする(カラーチャンネルが16bit以上の場合)
//JPEGは24ビットまでしか扱えない。8bit*RGBの3チャンネルで24bit
//保存時に自動的に変換...というのはないみたい
doc.bitsPerChannel = BitsPerChannelType.EIGHT;

jpg保存オプション設定

jpegOpt = new JPEGSaveOptions();

//カラープロファイルを埋め込むか
jpegOpt.embedColorProfile = false;  

//画質(1~12 デフォルトは3 大きいほど高品質)
jpegOpt.quality = 7;

//ベースライン・プログレッシブの指定
jpegOpt.formatOptions = FormatOptions.STANDARDBASELINE;

//マットタイプの指定....これはよくわからない
pegOpt.matte = MatteType.WHITE;

Web用に保存する

//Web用に保存用の設定をする
var exp = new ExportOptionsSaveForWeb();

//画像の形式
//COMPUSERVEGIF, JPEG, PNG-8, PNG-24, BMP の指定が可能
exp.format = SaveDocumentType.JPEG;

//インターレースにするか(プログレッシブJPGにするか) 
exp.interlaced = false;

//最適化するか
exp.optimized= false;

//画質(0~100 デフォルトは60 大きいほど高品質)
exp.quality = 70;

//エクスポート実行
var imgfile = new File("/d/sample/test_web.jpg");
doc.exportDocument(imgfile, ExportType.SAVEFORWEB, exp);

フォルダの操作

var dir = new Folder(IN_DIR);
        
//フォルダの存在確認
if(dir.exists){
    //フォルダ有
}

//指定フォルダ以下のファイルリストを取得
//フィルタ指定も可能
var files = dir.getFiles("*.psd");

//フォルダ以下のファイル数取得
var filecnt = files.length;

//1つめのファイル名取得
var file = files[0];

選択範囲の操作

//選択範囲設定
var s_x1 = BORDER_WIDTH;
var s_y1 = BORDER_WIDTH;
var s_x2 = w - BORDER_WIDTH;
var s_y2 = h - BORDER_WIDTH;

var s_reg = [[s_x1, s_y1], [s_x2, s_y1], [s_x2, s_y2], [s_x1, s_y2]];
doc.selection.select(s_reg);
doc.selection.invert();  //選択範囲反転

//選択範囲を塗りつぶす
var b_color = new SolidColor();

//modelの指定をしないと、下記のfillメソッドを呼び出し時に内部エラーになる。
//変数名がRGBColorの場合は、指定しなくてもエラーにならなかった。謎。
b_color.model = ColorModel.RGB; 

b_color.red = 255;
b_color.green = 255;
b_color.blue = 20;

doc.selection.fill(b_color, ColorBlendMode.NORMAL, 50, false);

//選択範囲解除
doc.selection.deselect();