Amazonで商品を見るセール会場へ

Photoshopスクリプト(jsx)│選択したPSDを画像アセットで書き出す方法

Photoshopの画像アセット機能を使うと、指定したレイヤーやドキュメントからPNGやJPG画像を自動で書き出せます。

ただし、スクリプトで自動処理する際は、Generatorのバックグラウンド処理のタイミングに注意が必要です。

本記事では、選択したPSDを画像アセット機能で書き出すスクリプトの手順と注意点を解説します。

目次

画像アセット機能とは

Photoshopの画像アセット機能は、レイヤー名を拡張子付きに変更するだけで画像を自動書き出しできる機能です。

レイヤー名に拡張子や倍率を指定すると、保存時に指定フォーマットへ自動変換されます。

  • ボタン.png
  • アイコン.jpg
  • バナー 50% → 50%に縮小して画像を書き出し

スクリプトで画像アセットを書き出す手順

処理は以下の3つのスクリプトに分けて実行します。

  • RenameForAssets.jsx(画像アセットのルールに従ってレイヤーをリネーム)
  • EnableAssets.jsx(ドキュメントの画像アセット機能を有効化)
  • ExportPsdAsAssets.jsx(選択したPSDを開いて画像アセットを書き出し)

Photoshopのスクリプト一覧や関連記事はまとめ記事で確認できます。

STEP.1 画像アセット用にリネーム

対象のレイヤー(例:リネーム)を「PSD名.png」などのアセット規則に合わせて自動変更するスクリプトです。

RenameForAssets.jsx

var doc = app.activeDocument;
doc.activeLayer = doc.layers.getByName("リネーム");

var fileName = doc.name;
var fileName = baseName(fileName);

//レイヤーリネーム
doc.activeLayer.name = fileName + ".png" + "," + "32x32 fileName" + ".png";

//保存して閉じる
doc.save();
doc.close();


//拡張子を抜く
function baseName(str) {
    var base = new String(str).substring(str.lastIndexOf('/') + 1);
    if (base.lastIndexOf(".") != -1)
        base = base.substring(0, base.lastIndexOf("."));
    return base;
}

STEP.2 画像アセット機能を有効化

画像アセット機能が無効になっている場合に実行し、設定を有効化(ON)にします。

EnableAssets.jsx

var doc = app.activeDocument;
doc.activeLayer = doc.layers.getByName("リネーム");

var fileName = doc.name;
var fileName = baseName(fileName);

//レイヤーリネーム
doc.activeLayer.name = fileName + ".png" + "," + "32x32 fileName" + ".png";

//保存して閉じる
doc.save();
doc.close();


//拡張子を抜く
function baseName(str) {
    var base = new String(str).substring(str.lastIndexOf('/') + 1);
    if (base.lastIndexOf(".") != -1)
        base = base.substring(0, base.lastIndexOf("."));
    return base;
}

STEP.3 選択したPSDを画像アセットで一括書き出し

選択したPSDファイルを順次開き、画像アセット機能で画像を書き出すバッチ処理スクリプトです。

ExportPsdAsAssets.jsx

var ps_name = app.path.fsName + "\\Photoshop.exe";
var gn_name = app.path.fsName + "\\Presets\\Scripts\\generate.jsx";

var files = app.openDialog();

if (files) {
    var sc_name = Folder.temp.fsName + "\\" + "temp.jsx";
    var sc_file = new File(sc_name);
    sc_file.encoding = "UTF8";
    sc_file.open("w");

    sc_file.writeln("while (documents.length > 1) documents[0].close(SaveOptions.DONOTSAVECHANGES)");
    sc_file.writeln("$.evalFile(" + gn_name.toSource() + ")");

    sc_file.close();

    var bat_name = Folder.temp.fsName + "\\" + "temp.bat";
    var bat_file = new File(bat_name);
    bat_file.encoding = "UTF8";
    bat_file.open("w");

    for (var i = 0; i < files.length; i++) {
        bat_file.writeln("\"" + ps_name + "\"" + " " + "\"" + files[i].fsName + "\"");
        bat_file.writeln("\"" + ps_name + "\"" + " " + "\"" + sc_name + "\"");
        bat_file.writeln("timeout 3");
    }

    bat_file.close();

    bat_file.execute();
}

ExtendScript Toolkit(ESTK)から実行します。

コマンドライン(CMD)やバッチファイルから実行する場合は、指定パスや引数の記述ミスにご注意ください。

スクリプト実行時の注意点

  1. スクリプト実行中はGeneratorの書き出しが完了しない場合がある
    • スクリプト内で書き出し完了を待たずにPSDを閉じると、アセットが出力されません。
    • $.sleep(5000);による待機処理を挟んでもGeneratorの生成完了を待てない場合があります。
  2. 対策:外部スクリプトやバッチから個別に呼び出す
    • ドロップレット形式(.exe)にして外部から起動する
    • batバッチ(.bat)ファイルからPhotoshopを起動して順次処理する

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。

読み込みと書き出しの記事は、ほかにもあります。

まとめ

  • レイヤー名のリネームと書き出し設定をスクリプトで自動化可能
  • 複数のPSDファイルに対して一括で処理を実行可能
  • 画像アセット機能の有効化状態を確認して実行することが重要
  • ファイルクローズ時のGenerator未完了問題は外部連携で制御可能

スクリプトを活用することで、多数のPSDからの画像アセット書き出し作業を効率化できます。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次