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 に実際の実行ファイルのパスを指定します。この例は実機の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] のない例が抽出する画像列を、レイヤーカンプの結果と扱うことはできません。コード内の個人環境のパスや「完了」という表示だけで、全件の変換成功を判断しないでください。

結果の確認と使い分け

  1. 入力PSDの件数と、成功・保留・失敗の件数を照合します。
  2. 成功とされた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 にフラット出力しました"

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

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

Photoshopのおすすめ書籍

動作要件とPCの確認項目

周辺機器の優先度

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