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

フォルダー内のPSDをPNGに一括変換する方法|ImageMagick・階層・同名ファイル

複数のフォルダーに分かれたPSDから、各ファイルの保存済み合成画像をPNGにする場合は、ImageMagickで変換できます。PSDを列挙する処理と、1ファイルを変換する処理を組み合わせます。

この方法は、Photoshopのレイヤーカンプを切り替えて書き出す処理ではありません。カンプごとの表示差分が必要な場合は、レイヤーカンプの書き出しを使います。Photoshop自身でPSDを開いてJPG・PNGへ保存する方法は、JSXによるPSD一括出力に分けています。

目次

合成画像・レイヤー画像・レイヤーカンプの違い

欲しい出力 入力と方法
PSDごとに1枚の見本画像 ImageMagickでPSDの先頭画像 [0] を選ぶ例。保存済み合成画像の内容を確認します。
PSD内の各画像・レイヤーを取り出す [0] を付けない入力は複数画像として扱われる場合があります。合成画像も含む画像列と、各レイヤーの対応を確認します。
表示・位置・効果の差分をカンプごとに出す Photoshopでレイヤーカンプを適用して書き出します。画像列を抽出するだけでは代用できません。
Photoshopで表示した見た目を優先する Photoshopで対象PSDを開いて出力し、色・効果・透明度を照合します。

ImageMagickの画像番号指定と出力名は、公式のコマンドライン処理で確認できます。PSDの先頭画像をPNGにする例は、プロジェクト内のPSD変換に関する説明でも示されています。

旧記事の「レイヤー差分を高速に出力」は、レイヤーカンプの展開や速度比較の実測として読める表現でした。今回の確認では速度比較を行っていないため、所要時間の優劣は断定しません。

スポンサーリンク

最初に1ファイルで変換を確認する

ImageMagick 7の magick を使います。コマンドはターミナルで実行します。出力名には、まだ存在しないファイル名を指定してください。

magick -version
magick "sample.psd[0]" "sample-check.png"

[0] は先頭画像を読む指定です。透明度を保つか、背景が入っているか、期待したレイヤーが表示されているかは、PSDの保存済み内容と出力を見て確認します。PNGを選ぶだけで、元の合成画像にない透明度が追加されるとは限りません。

1ファイルの確認後に、代表例を増やします。透明なPSD、効果を含むPSD、同じ名前で別フォルダーにあるPSDを用意すると、一括処理前に確認すべき差が分かります。

サブフォルダーを含めて変換するPython例

次の例は、Pythonで入力フォルダー内の .psd を再帰的に列挙し、ImageMagickで各PSDの先頭画像をPNGにします。入力の相対的なフォルダー構造を出力先へ引き継ぎます。a/logo.psd と b/logo.psd は、a/logo.png と b/logo.png に分かれます。

SOURCE と DEST を自分のフォルダーに変更して、psd_to_png.py として保存します。PATHに magick がない場合は、MAGICK に実際の実行ファイルのパスを指定します。保存後、Python 3が利用できるターミナルを開き、スクリプトを保存したフォルダーでpython psd_to_png.pyを実行します。Python 3の起動コマンドがpython3の環境ではpython3 psd_to_png.pyとします。Python公式のコマンドライン説明のとおり、実行するファイル名を引数に渡します。まず少数のコピーを入力にして、ターミナルの最終件数と出力PNGを確認してください。この例は実機のImageMagickで未実行です。

from pathlib import Path
import shutil
import subprocess

SOURCE = Path("C:/work/input_psd").resolve()
DEST = Path("C:/work/output_png").resolve()
MAGICK = shutil.which("magick")

if not SOURCE.is_dir():
    raise SystemExit("入力フォルダーがありません")
if MAGICK is None:
    raise SystemExit("ImageMagick 7のmagickが見つかりません")
if SOURCE == DEST or SOURCE in DEST.parents or DEST in SOURCE.parents:
    raise SystemExit("入力と出力は互いを含まない別フォルダーにしてください")

files = sorted(p for p in SOURCE.rglob("*")
               if p.is_file() and p.suffix.lower() == ".psd")
ok = skipped = failed = 0
for source in files:
    target = DEST / source.relative_to(SOURCE).with_suffix(".png")
    target.parent.mkdir(parents=True, exist_ok=True)
    try:
        with target.open("xb") as stream:
            result = subprocess.run(
                [MAGICK, str(source) + "[0]", "PNG:-"],
                stdout=stream, stderr=subprocess.PIPE,
                check=False
            )
    except FileExistsError:
        skipped += 1
        print("既存ファイルを保留:", target)
        continue
    if result.returncode != 0:
        failed += 1
        print("変換失敗:", source)
        print(result.stderr.decode("utf-8", errors="replace"))
    else:
        ok += 1
        print("変換:", source, "->", target)

print(f"対象={len(files)} 成功={ok} 保留={skipped} 失敗={failed}")
if failed:
    raise SystemExit(1)

PNG:- は変換結果を標準出力へ書く指定で、Python側が新規PNGファイルへ保存します。open("xb") により、同じ出力名がすでにある場合は上書きせず保留します。変換に失敗した場合は、不完全な新規ファイルが残る可能性があります。ログに出た出力を確認し、元PSDと区別して整理してください。不完全なPNGが残ったまま再実行すると、既存ファイルとして保留されます。また、フォルダー作成・書き込み権限・magick起動時の例外はこのコードでは集計せず処理が中断するため、最後の件数表示が出たかも確認します。

macOSでもPythonコードの構造は同じです。SOURCE と DEST をmacOSのパスに変更し、使用する環境で magick を確認します。PSB、レイヤー画像列、カンプの切り替えはこのコードの対象に含めていません。

旧バッチ例を使う前に確認すること

旧記事にはWindowsの .bat とmacOSの .command・.sh の例を掲載していました。原文は末尾へ残しています。

旧例はサブフォルダーのファイルを1つの出力フォルダーへ集める構成です。別フォルダーに同じbasenameがあると、同じ出力先に書き込む可能性があります。また、[0] のない例が抽出する画像列を、レイヤーカンプの結果と扱うことはできません。コード内の個人環境のパスや「完了」という表示だけで、全件の変換成功を判断しないでください。

結果の確認と使い分け

  1. 入力PSDの件数と、成功・保留・失敗の件数を照合します。
  2. このコードの成功件数はmagickの終了コードが0だった件数です。PNGの中身を検証した件数ではないため、成功とされたPNGも開き、寸法・透明度・内容を確認します。
  3. 効果や色が重要なPSDは、Photoshopの書き出し結果と比較します。
  4. 合成画像と期待した表示状態が一致しない場合は、PSDの保存済み内容を確認します。
  5. 差分がカンプの登録によるものなら、Photoshopでカンプを適用して出力します。

Pythonでレイヤー情報の取得や合成方法を指定したい場合は、psd-toolsの使い方を参照してください。標準機能でJPEG・PSD・TIFFへ変換する場合は、イメージプロセッサーが候補になります。

確認した範囲と旧配布コード

2026年10月3日にImageMagick公式資料、PSD変換の説明、旧記事の4コードを読み、入力番号指定と同名出力の問題を確認しました。今回のPCではPATHから magick を取得できず、上の一括変換例はImageMagickで未実行です。Photoshopとの描画比較と速度測定も未確認です。

旧記事に対応するGitHubのコード一覧を残しています。旧画像は過去に掲載した資料で、今回の変換結果ではありません。

PSDに含まれるレイヤー差分を高速にPNGへ書き出す手段としてImageMagickを利用する流れを示す図。
過去の記事で使用した掲載画像です。今回のPhotoshop実機確認ではありません。

旧掲載コードの比較資料

旧Windows/macOS例は平坦な出力先への同名衝突があり、画像列をカンプと表記した箇所もあります。上の説明と照合してください。

旧コード4ブロックを表示(原文・現行版の一括動作は未検証)
@echo off
setlocal EnableExtensions

set "IN=C:\Users\min sui\Desktop\psd"
set "OUT=C:\Users\min sui\Desktop\png"
set "MAG=C:\Program Files\ImageMagick-7.1.2-Q16-HDRI\magick.exe"

if not exist "%OUT%" mkdir "%OUT%"

for /r "%IN%" %%F in (*.psd) do (
  "%MAG%" "%%~fF" -alpha on -define psd:preserve-opacity=true -colorspace sRGB "%OUT%\%%~nF.png"
)

echo 完了
@echo off
setlocal EnableExtensions

rem === 設定 ===
set "IN=C:\Users\min sui\Desktop\psd"
set "OUT=C:\Users\min sui\Desktop\png"
set "MAG=C:\Program Files\ImageMagick-7.1.2-Q16-HDRI\magick.exe"

if not exist "%OUT%" mkdir "%OUT%"

for /r "%IN%" %%F in (*.psd) do (
  "%MAG%" "%%~fF[0]" -alpha on -define psd:preserve-opacity=true -colorspace sRGB "%OUT%\%%~nF.png"
)

echo 完了
#!/usr/bin/env bash
set -euo pipefail

# ===== 設定 =====
IN="$HOME/Desktop/psd"
OUT="$HOME/Desktop/png"
MAG="/opt/homebrew/bin/magick"    # Intelなら /usr/local/bin/magick

mkdir -p "$OUT"

find "$IN" -type f \( -iname '*.psd' -o -iname '*.psb' \) -print0 |
while IFS= read -r -d '' f; do
  base="$(basename "$f")"
  name="${base%.*}"

  # レイヤー/コンプを展開(name-0.png, name-1.png ... が OUT 直下に並ぶ)
  "$MAG" "$f" -alpha on -define psd:preserve-opacity=true -colorspace sRGB \
    "$OUT/$name.png"
done

echo "完了:$OUT にフラット出力しました(レイヤー展開あり)"
#!/usr/bin/env bash
set -euo pipefail

# ===== 設定 =====
IN="$HOME/Desktop/psd"            # 変換元(再帰で辿る)
OUT="$HOME/Desktop/png"           # 出力先(フラット=直下に並べる)
MAG="/opt/homebrew/bin/magick"    # Intelなら /usr/local/bin/magick

mkdir -p "$OUT"

# PSD / PSB を再帰で列挙(スペース対応)
find "$IN" -type f \( -iname '*.psd' -o -iname '*.psb' \) -print0 |
while IFS= read -r -d '' f; do
  base="$(basename "$f")"
  name="${base%.*}"

  # 同名衝突を避けたい場合は以下の2行を有効化(重複時に _1, _2... 付与)
  # out="$OUT/$name.png"; n=1
  # while [[ -e "$out" ]]; do out="$OUT/${name}_$n.png"; ((n++)); done

  # 統合ビューだけ([0])を1枚出力
  "$MAG" "$f[0]" -alpha on -define psd:preserve-opacity=true -colorspace sRGB \
    "$OUT/$name.png"
done

echo "完了:$OUT にフラット出力しました"
スポンサーリンク

よくある質問:フォルダー内のPSDをPNGに一括変換する

複数のフォルダーに分かれたPSDを、まとめてPNGにするには、どうしますか?

各PSDの保存済み合成画像をPNGにする場合は、ImageMagickで変換できます。PSDを列挙する処理と、1ファイルを変換する処理を組み合わせます。記事では、ImageMagick 7のmagickを使い、PSDの先頭画像 [0] を選ぶ例を紹介しています。出力名には、まだ存在しないファイル名を指定してください。

Photoshopのレイヤーカンプを、切り替えて書き出せますか?

この方法は、Photoshopのレイヤーカンプを切り替えて書き出す処理ではありません。カンプごとの表示差分が必要な場合は、Photoshopでレイヤーカンプを適用して書き出します。画像列を抽出するだけでは代用できません。Photoshop自身でPSDを開いてJPG・PNGへ保存する方法は、「JSXによるPSD一括出力」の記事に分けています。

[0]を付けるのと付けないのとでは、何が違いますか?

[0]は、PSDの先頭画像(保存済み合成画像)を選ぶ指定です。[0]を付けない入力は、複数画像として扱われる場合があり、合成画像も含む画像列と、各レイヤーの対応を確認する必要があります。ImageMagickの画像番号指定と出力名は、公式のコマンドライン処理で確認できます。

記事のPythonコードは、どう使いますか?

サブフォルダーを含めて変換する例で、SOURCEとDESTを自分のフォルダーに変更して、psd_to_png.pyとして保存します。Python 3のターミナルで保存先へ移動し、python psd_to_png.py(起動コマンドがpython3ならpython3 psd_to_png.py)で実行します。PATHにmagickがない場合は、MAGICKに実際の実行ファイルのパスを指定します。入力の相対的なフォルダー構造を出力先へ引き継ぎ、a/logo.psdとb/logo.psdは、a/logo.pngとb/logo.pngに分かれます。open(“xb”)により、同じ出力名がすでにある場合は上書きせず保留します。変換に失敗した場合は、不完全な新規ファイルが残る可能性があるため、ログに出た出力を確認し、元PSDと区別して整理してください。不完全なPNGが残ったまま再実行すると、既存ファイルとして保留されます。また、フォルダー作成・書き込み権限・magick起動時の例外はこのコードでは集計せず処理が中断するため、最後の件数表示が出たかも確認します。macOSでもPythonコードの構造は同じで、SOURCEとDESTをmacOSのパスに変更し、使用する環境でmagickを確認します。PSB、レイヤー画像列、カンプの切り替えは、このコードの対象に含めていません。

旧記事のバッチ例は、そのまま使えますか?

旧記事にはWindowsの.batとmacOSの.command・.shの例を掲載していましたが、使う前に確認が必要です。旧例はサブフォルダーのファイルを1つの出力フォルダーへ集める構成で、別フォルダーに同じbasenameがあると、同じ出力先に書き込む可能性があります。また、[0]のない例が抽出する画像列を、レイヤーカンプの結果と扱うことはできません。コード内の個人環境のパスや「完了」という表示だけで、全件の変換成功を判断しないでください。原文は記事の末尾に残しています。

変換した結果は、どう確認しますか?

入力PSDの件数と、成功・保留・失敗の件数を照合します。このコードの成功件数はmagickの終了コードが0だった件数です。PNGの中身を検証した件数ではないため、成功とされたPNGも開き、寸法・透明度・内容を確認します。効果や色が重要なPSDは、Photoshopの書き出し結果と比較します。合成画像と期待した表示状態が一致しない場合は、PSDの保存済み内容を確認します。差分がカンプの登録によるものなら、Photoshopでカンプを適用して出力します。

PythonでレイヤーをPNGにしたいときや、標準機能で変換したいときは?

Pythonでレイヤー情報の取得や合成方法を指定したい場合は、関連記事「psd-toolsの使い方」を参照してください。標準機能でJPEG・PSD・TIFFへ変換する場合は、イメージプロセッサーが候補になります。

記事の方法は、実際のImageMagickで確認されていますか? 速度は速いのですか?

2026年10月3日にImageMagick公式資料、PSD変換の説明、旧記事の4コードを読み、入力番号指定と同名出力の問題を確認しました。記事のPCではPATHからmagickを取得できず、一括変換例は実機のImageMagickで未実行です。Photoshopとの描画比較と速度測定も未確認で、旧記事の「レイヤー差分を高速に出力」という表現は、実測として読めるものでしたが、今回は速度比較を行っていないため、所要時間の優劣は断定していません。最新はImageMagickの公式資料で確認してください。

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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