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

PhotoshopでsRGBのJPEGを一括保存するJSX|上書き確認とエラー処理

画像のプロファイルをsRGBへ変換し、別フォルダーにJPEGのコピーを保存するスクリプトです。

元ファイルは保存せずに閉じ、入力ファイル名の拡張子も出力名に残します。

sample.pngとsample.jpgは、sample.png.jpgとsample.jpg.jpgになるため、同じベース名の画像を区別できます。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、このコードを画面から実行した結果を「Photoshop 2026で実行した結果」に載せています。

目次

標準機能とJSXの使い分け

フォルダーの画像をsRGBのJPEGにするだけなら、標準のイメージプロセッサーでも対応できます。[JPEGとして保存]と[プロファイルをsRGBに変換]を選び、[ICCプロファイルを含める]も確認してください。

このJSXは、入力の拡張子を残した命名、既存出力があるときの中断、失敗したファイルの一覧が必要な場合の例です。初めて外部JSXを使う場合は、スクリプトを参照して実行する手順も確認してください。

スポンサーリンク

練習用データと実行前の条件

JSXと練習用画像のZIPをダウンロードし、任意の作業フォルダーへ展開します。

画像は架空の256×128pxデータで、Photoshopの実画面や実機での書き出し結果ではありません。

sample.pngとsample.jpgだけを入力フォルダーへコピーし、出力用の空フォルダーを別に作ります。

入力はプロファイル付きのRGB・8bit画像を使います。

実行前に[編集]→[カラー設定]のRGBポリシーを確認します。元の埋め込みプロファイルから変換する場合は[埋め込まれたプロファイルを保持]を選びます。[作業用スペースに変換]では画像を開く段階で色が変換され、[オフ]では埋め込みプロファイルが無視されます。変更前の設定を控え、必要なら実行後に戻してください。

コードが判定するのは、開いた後の文書のプロファイルです。元ファイルにICCプロファイルが入っていたかどうかを、別途検査するコードではありません。プロファイルなしの画像はこの例の入力に含めず、読み込み時の警告で元の色空間を推測して割り当てないでください。

CMYK、16bit、プロファイルなしの文書はスクリプト内で除外します。

プロファイルが不明な画像へsRGBを割り当てると色の解釈が変わるため、コピーの正しい元プロファイルを先に確認してください。

JPEGでは透明を保持できないため、透明が必要な画像にはこの処理を使いません。

既存の文書は自分で保存して閉じてください。

スクリプトは文書が開いている場合に停止するため、作業中の文書を勝手に閉じません。

入力と出力に同じフォルダーは選べず、出力先に予定の名前が1件でも存在すると、画像を開く前に全体を停止します。

コピーして使うJSXコード

#target photoshop
(function () {
    if (app.documents.length > 0) {
        alert("Save and close your open documents before running this script.");
        return;
    }
    var src = Folder.selectDialog("Select the input folder");
    if (!src) return;
    var dst = Folder.selectDialog("Select a separate, empty output folder");
    if (!dst) return;
    if (src.fsName.toLowerCase() === dst.fsName.toLowerCase()) {
        alert("Input and output folders must be different.");
        return;
    }
    var files = src.getFiles(function (f) {
        return f instanceof File && /\.(psd|tif|tiff|jpg|jpeg|png)$/i.test(f.name);
    });
    var targets = [], seen = {}, i;
    if (!files.length) { alert("No supported input files."); return; }
    for (i = 0; i < files.length; i++) {
        // Keep the original extension: sample.png.jpg and sample.psd.jpg.
        var target = new File(dst.fsName + "/" + decodeURI(files[i].name) + ".jpg");
        var key = target.fsName.toLowerCase();
        if (target.exists || seen[key]) {
            alert("Output already exists or is duplicated: " + target.fsName);
            return;
        }
        seen[key] = true;
        targets.push(target);
    }
    var opts = new JPEGSaveOptions();
    opts.quality = 10;
    opts.embedColorProfile = true;
    var saved = 0, failed = [], closeErrors = [];
    for (i = 0; i < files.length; i++) {
        var doc = null;
        try {
            if (targets[i].exists) throw new Error("Output appeared after the initial check.");
            doc = app.open(files[i]);
            if (doc.mode !== DocumentMode.RGB || doc.bitsPerChannel !== BitsPerChannelType.EIGHT) {
                throw new Error("Use an 8-bit RGB input copy.");
            }
            if (doc.colorProfileType === ColorProfile.NONE) {
                throw new Error("Assign the correct source profile to a copy first.");
            }
            doc.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC, true, false);
            if (targets[i].exists) throw new Error("Output appeared before saving.");
            doc.saveAs(targets[i], opts, true, Extension.LOWERCASE);
            saved++;
        } catch (e) {
            failed.push(files[i].name + ": " + e.message);
        } finally {
            if (doc) {
                try { doc.close(SaveOptions.DONOTSAVECHANGES); }
                catch (e2) { closeErrors.push(files[i].name + ": " + e2.message); }
            }
        }
        // Stop if a document could not be closed; do not accumulate more open files.
        if (closeErrors.length) break;
    }
    alert("Saved: " + saved + " / " + files.length +
        "\nFailed: " + failed.length + "\n" + failed.join("\n") +
        "\nClose errors: " + closeErrors.length + "\n" + closeErrors.join("\n"));
}());

実行と結果の確認

コードをUTF-8のarticle-1388.jsxとして保存し、Photoshopの[ファイル]→[スクリプト]→[参照]で選びます。

ZIP内の同名ファイルを使う場合は再保存不要です。

最初のダイアログで入力フォルダー、次のダイアログで空の出力フォルダーを選びます。

途中でキャンセルした場合は画像を開きません。

練習用の2画像では、完了表示のSavedが2、Failedが0、Close errorsが0になることを確認します。

配布した2画像には、生成時からsRGBのICCプロファイルを埋め込んでいます。この入力で確かめるのは保存・命名・プロファイルの保持です。Adobe RGBなどからsRGBへの変換を確かめる場合は、元のプロファイルが分かっている別のRGB・8bitコピーを用意してください。

出力JPEGを開き直し、256×128pxであることと、文書のプロファイルがsRGB IEC61966-2.1になっていることを確認してください。

原本の更新日時と内容が変わっていないことも確認します。

見た目だけでプロファイル変換の成功を判断しないでください。

qualityの10はJPEGSaveOptionsの0〜12の設定です。

[書き出し形式]の画質パーセントとは別の値なので、その画面の数値をコードへそのまま移しません。

embedColorProfile=trueで出力プロファイルを埋め込みます。convertProfileの引数は、変換先がsRGB IEC61966-2.1、インテントが相対的な色域を維持(RELATIVECOLORIMETRIC)、黒点補正が有効、ディザが無効という指定です。別のインテントを使う制作条件では、この例の指定をそのまま採用せず、同じ入力コピーで変換結果を確認してください。

Photoshop 2026で実行した結果

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、上のコードを改変せずにarticle-1388.jsxとして保存し、[ファイル]→[スクリプト]→[参照]から3回実行しました。

保存したコードは、練習用ZIPのarticle-1388.jsxと中身が同じです。

実行前は文書を1つも開いていない状態にしました。

カラー設定は、RGBの作業用スペースがsRGB IEC61966-2.1、RGBのポリシーが[埋め込まれたプロファイルを保持]で、プロファイルの不一致と欠落を開くときに確認する設定はオフでした。

カラー設定は別のスクリプトで読み取っただけで、変えていません。

[参照]から実行して、フォルダーを2つ選ぶ

Photoshopのファイルメニューからスクリプトのサブメニューを開き、参照を選んでいる画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。[ファイル]→[スクリプト]→[参照]を選んでいるところ。

[ファイル]→[スクリプト]→[参照]を選び、保存したファイルを読み込みます。

Select the input folderの窓でset1を選び、Select a separate, empty output folderの窓でrun1を選んでいる画面
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。スクリプトが開く入力フォルダー(上)と出力フォルダー(下)の選択の窓。左の一覧は塗りつぶしています。

最初にSelect the input folderという題名の、Windowsのフォルダー選択の窓が開きました。

この窓は、読み込んだスクリプトの置き場所のフォルダーで開きました。

入力フォルダーを1回押して[フォルダーの選択]を押すと、続けてSelect a separate, empty output folderの窓が開きます。

2つ目の窓は、直前に選んだ入力フォルダーの中で開いたので、出力用の空フォルダーまで移動してから選びました。

画面のR:は、確認のために作業フォルダーへ割り当てた一時的なドライブです。

練習用の2画像は、Saved 2で保存された

Saved: 2 / 2、Failed: 0、Close errors: 0と表示されたスクリプト警告
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。練習用の2画像で実行した後の完了表示。

練習用ZIPのsample.pngとsample.jpgだけを入れたフォルダーを選ぶと、2枚が順に開いて閉じ、完了表示はSavedが2、Failedが0、Close errorsが0でした。

出力フォルダーにはsample.jpg.jpgとsample.png.jpgの2つができました。

書き出したJPEGを別のスクリプトでPhotoshopに開いて読み取ると、どちらも256×128px、RGB・8bitで、文書のプロファイルはsRGB IEC61966-2.1でした。

入力の2画像は、実行の前後で更新日時もファイルの中身(SHA-256)も変わりませんでした。

実行後に開いたままの文書はありませんでした。

同じ出力先では開く前に止まり、プロファイルなしはFailedになった

Output already exists or is duplicatedと表示された警告と、Saved: 2 / 3、Failed: 1でnoprofile.pngの理由が表示された警告
2026-10-19撮影。Adobe Photoshop 2026 (27.11.0)、Windows 11 Pro (10.0.26200)。同じ出力先で再実行したときの停止(上)と、自作の3画像で実行した後の完了表示(下)。

同じ入力と出力のフォルダーを選んでもう一度実行すると、Output already exists or is duplicated:に続けて既存の出力のパスが表示され、止まりました(上)。

このとき画像は1枚も開かれず、既存の2つのJPEGの更新日時も変わりませんでした。

次に、自作の3画像を入れた別のフォルダーと、別の空の出力フォルダーを選んで実行しました(下)。

3画像は、Adobe RGB (1998)を埋め込んだPNG、プロファイルを入れていないPNG、練習用ZIPのpractice-transparent.pngです。

入力結果
Adobe RGB (1998)のPNG保存された。RGBの値が200・60・40の色は232・58・34に変わり、プロファイルはsRGB IEC61966-2.1になった
プロファイルなしのPNGFailedに数えられ、Assign the correct source profile to a copy first.と表示された。出力は作られなかった
practice-transparent.png止まらずに保存された。透明だった部分は白に、半透明の部分は白と混ざった色になった

完了表示はSavedが2、Failedが1でした。

Adobe RGB (1998)の画像は、RGBの数値が変わっていることから、sRGBへの変換が行われたと分かります。

0・255・0の緑はsRGBで表せない色なので、0・255・1になりました。

透明のある画像は、このコードでは除外されず、Savedに数えられます。

透明が必要な画像を入力フォルダーに入れないでください。

確かめていないこと

CMYK・16bitの入力、PSDとTIFFの入力、入力と出力に同じフォルダーを選んだ場合、文書を開いたまま実行した場合、フォルダー選択の取り消しは確かめていません。

閉じる処理の失敗(Close errors)と、確認の後で出力が現れる場合も確かめていません。

カラー設定のポリシーが[作業用スペースに変換]や[オフ]の場合、プロファイルの欠落を確認する設定がオンの場合も確かめていません。

Mac版とほかの版も確かめていません。

途中で失敗した場合と戻し方

表示・条件次に行う確認
Output already exists別の空フォルダーを選ぶ。既存画像を自動上書きしない
Use an 8-bit RGB input copy原本を残して複製をRGB・8bitに準備する
Assign the correct source profile元の色空間を確認する。不明な画像に推測で割り当てない
Failedが1以上該当ファイルとメッセージを読み、出力を開いて確認する
Close errorsが1以上後続処理は停止。残った文書の保存状態を確認する

各画像はfinallyで保存せずに閉じる処理を試みます。

閉じる処理自体が失敗した場合は、それ以上の画像を開かず停止します。

書き込み失敗後の出力が正常とは限らないため、Savedの数と実ファイルを照合してください。

元の状態へ戻す場合は原本を開き、不要な出力は別フォルダーへ退避します。

同じ出力先を他のアプリや別のバッチと同時に使わないでください。

保存直前にも存在確認を行いますが、確認と保存を一つの排他処理にする仕組みではありません。

シンボリックリンクなどで同じ場所を別パスとして選ぶ運用も避けます。

確認範囲と公式資料

2026年10月3日、Adobeのスクリプト実行手順、カラー設定の旧参照先(現在は作業用スペースの説明へ転送)と現行のカラーマネジメントポリシー、イメージプロセッサーの設定を確認しました。

この記事の配布コードと本文の一致、練習用画像の寸法・RGBモード・ICCプロファイルを確認しました。Node.jsの模擬APIでは、中断、既存出力、RGB・8bitの条件、変換・保存・終了時のエラーなど16項目を確認しています。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、練習用の2画像と自作の3画像を使って画面から実行し、保存・命名・sRGBへの変換・既存の出力での停止・プロファイルなしの除外を確かめました。

結果は「Photoshop 2026で実行した結果」にまとめています。

CMYK・16bitの入力や閉じる処理の失敗などは確かめていないため、まず練習用コピーで確認してください。

スポンサーリンク

よくある質問:sRGBのJPEGを一括保存するJSX

このスクリプトは、何をしますか?

画像のプロファイルをsRGBへ変換し、別フォルダーにJPEGのコピーを保存するスクリプトです。元ファイルは保存せずに閉じ、入力ファイル名の拡張子も出力名に残します。たとえばsample.pngとsample.jpgは、sample.png.jpgとsample.jpg.jpgになるため、同じベース名の画像を区別できます。

標準機能では、できないのですか?

フォルダーの画像をsRGBのJPEGにするだけなら、標準のイメージプロセッサーでも対応できます。[JPEGとして保存]と[プロファイルをsRGBに変換]を選び、[ICCプロファイルを含める]も確認してください。このJSXは、入力の拡張子を残した命名、既存出力があるときの中断、失敗したファイルの一覧が必要な場合の例です。

実行する前に、何を確認しておきますか?

入力はプロファイル付きのRGB・8bit画像を使います。[編集]→[カラー設定]のRGBポリシーを確認し、元の埋め込みプロファイルから変換する場合は[埋め込まれたプロファイルを保持]を選びます。[作業用スペースに変換]では画像を開く段階で色が変換され、[オフ]では埋め込みプロファイルが無視されます。変更前の設定を控え、必要なら実行後に戻してください。コードが判定するのは、開いた後の文書のプロファイルで、元ファイルにICCプロファイルが入っていたかどうかを別途検査するコードではありません。プロファイルなしの画像は、この例の入力に含めず、読み込み時の警告で元の色空間を推測して割り当てないでください。

どうやって実行しますか?

コードをUTF-8のarticle-1388.jsxとして保存し、Photoshopの[ファイル]→[スクリプト]→[参照]で選びます。最初のダイアログで入力フォルダー、次のダイアログで空の出力フォルダーを選びます。途中でキャンセルした場合は、画像を開きません。スクリプトは文書が開いている場合に停止するため、作業中の文書を勝手に閉じません。入力と出力に同じフォルダーは選べず、出力先に予定の名前が1件でも存在すると、画像を開く前に全体を停止します。

実行後は、何を確認すればよいですか?

練習用の2画像では、完了表示のSavedが2、Failedが0、Close errorsが0になることを確認します。出力JPEGを開き直し、256×128pxであることと、文書のプロファイルがsRGB IEC61966-2.1になっていることを確認してください。原本の更新日時と内容が変わっていないことも確認します。見た目だけでプロファイル変換の成功を判断しないでください。

画質(quality)は、どう指定しますか?

qualityの10は、JPEGSaveOptionsの0〜12の設定です。[書き出し形式]の画質パーセントとは別の値なので、その画面の数値をコードへそのまま移しません。embedColorProfileはtrueで、出力プロファイルを埋め込みます。

途中で失敗したときは、どうなりますか?

Output already existsの場合は、別の空フォルダーを選びます(既存画像は自動上書きしません)。Use an 8-bit RGB inputの場合は、原本を残して複製をRGB・8bitに準備します。Assign the correct source profileの場合は、元の色空間を確認し、不明な画像に推測で割り当てないでください。Failedが1以上なら、該当ファイルとメッセージを読み、出力を開いて確認します。Close errorsが1以上なら、後続処理は停止するので、残った文書の保存状態を確認します。書き込み失敗後の出力が正常とは限らないため、Savedの数と実ファイルを照合してください。同じ出力先を他のアプリや別のバッチと同時に使わないでください。

実際のPhotoshopで、動作確認されていますか?

記事の練習用画像は、架空の256×128pxデータで、Photoshopで作ったものではありません。

2026年10月19日に、Photoshop 2026(27.11.0)とWindows 11 Proで、このコードを[ファイル]→[スクリプト]→[参照]から実行しました。

練習用の2画像はSavedが2になり、sRGB IEC61966-2.1を埋め込んだ256×128pxのJPEGが保存されました。

Adobe RGB (1998)の画像はsRGBに変換され、プロファイルなしの画像はFailedになり、同じ出力先での再実行は画像を開く前に止まりました。

CMYK・16bitの入力、閉じる処理の失敗、Mac版などは確かめていません。

Node.jsの模擬APIでは、中断、既存出力、RGB・8bitの条件、変換・保存・終了時のエラーなど16項目を確認しています。

まず練習用コピーで確認してください。

最新はAdobe公式のスクリプト実行手順などで確認してください。

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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