複数のフォルダーに分かれた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 に実際の実行ファイルのパスを指定します。この例は実機の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と区別して整理してください。
macOSでもPythonコードの構造は同じです。SOURCE と DEST をmacOSのパスに変更し、使用する環境で magick を確認します。PSB、レイヤー画像列、カンプの切り替えはこのコードの対象に含めていません。
旧バッチ例を使う前に確認すること
旧記事にはWindowsの .bat とmacOSの .command・.sh の例を掲載していました。原文は末尾へ残しています。
旧例はサブフォルダーのファイルを1つの出力フォルダーへ集める構成です。別フォルダーに同じbasenameがあると、同じ出力先に書き込む可能性があります。また、[0] のない例が抽出する画像列を、レイヤーカンプの結果と扱うことはできません。コード内の個人環境のパスや「完了」という表示だけで、全件の変換成功を判断しないでください。
結果の確認と使い分け
- 入力PSDの件数と、成功・保留・失敗の件数を照合します。
- 成功とされたPNGを開き、寸法・透明度・内容を確認します。
- 効果や色が重要なPSDは、Photoshopの書き出し結果と比較します。
- 合成画像と期待した表示状態が一致しない場合は、PSDの保存済み内容を確認します。
- 差分がカンプの登録によるものなら、Photoshopでカンプを適用して出力します。
Pythonでレイヤー情報の取得や合成方法を指定したい場合は、psd-toolsの使い方を参照してください。標準機能でJPEG・PSD・TIFFへ変換する場合は、イメージプロセッサーが候補になります。
確認した範囲と旧配布コード
2026年10月3日にImageMagick公式資料、PSD変換の説明、旧記事の4コードを読み、入力番号指定と同名出力の問題を確認しました。今回のPCではPATHから magick を取得できず、上の一括変換例はImageMagickで未実行です。Photoshopとの描画比較と速度測定も未確認です。
旧記事に対応するGitHubのコード一覧を残しています。旧画像は過去に掲載した資料で、今回の変換結果ではありません。

旧掲載コードの比較資料
旧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 にフラット出力しました"
