PythonでPhotoshopのツールを作りたい

INDEX

はじめに

こんにちは。モノリスソフト テクニカルアーティストの菅原です。

先日Photoshopのツールを作成する機会があったのですが、その際にPythonでもPhotoshopのツールを作れるらしいということを知り、UI作成・保守の観点からPythonでの実装を行いました。

今回の記事は備忘録を兼ねたPythonでPhotoshopツールを作成する際の開発環境・パッケージ構成のまとめとなります。

サンプルファイル(monolithtech_photoshop_tool.zip 6.9 KB)はこちらです。

DOWNLOAD

開発環境

Githubで検索すると有志により作成されたPhotoshopのPythonAPIがいくつかヒットします。
今回はその中からphotoshop-python-apiを選択しました。

こちらは2026年現在でも管理されており、ドキュメントにサンプルが豊富なため非常にわかりやすかったです。

また今回はデザイナーに配布するツールを想定し、UI作成にPySide6・Python環境不要で実行するためにexe形式で配布するのでPyInstallerを使用します。

Python3.13・上記パッケージを全てインストールしたのち「pip list」からインストール済みパッケージを確認すると、作業時点では依存しているものを含め以下のパッケージがインストールされている状態になります。

Package                   Version
------------------------- ---------
altgraph                  0.17.5
comtypes                  1.4.16
packaging                 26.2
pefile                    2024.8.26
photoshop-python-api      0.24.2
pip                       26.1.2
pyinstaller               6.21.0
pyinstaller-hooks-contrib 2026.6
PySide6                   6.11.1
PySide6_Addons            6.11.1
PySide6_Essentials        6.11.1
pywin32-ctypes            0.2.3
setuptools                82.0.1
shiboken6                 6.11.1
wheel                     0.45.1

ツール構成

ツールとなるPythonパッケージは以下のようなファイル構成とします。

PHOTOSHOP_TOOL_SAMPLE
│  __init__.py
│  __main__.py
│  run_ver2025.jsx
│  run_ver2026.jsx
│  utils.py
│  [適宜ツールのPythonスクリプトを作成・追加...]
│
├─py_installer
│      build.bat
│
└─ui
         __init__.py
        form.ui
        ui2py.bat
        ui2py.py
        ui_form.py

この構成で重要なのは以下の3つです。

__main__.py Python環境でのツール起動スクリプト
build.bat PyInstallerでexe形式にビルドするバッチ
run_ver~.jsx Photoshopバージョンごとのツール起動スクリプト

Python環境でのツール起動スクリプト

photoshop-python-apiのドキュメントにあるサンプルコードを実行してみるとわかるのですが、こちらのPythonAPIを使用すると実際にPhotoshopが起動し、ツールで行った処理がPhotoshop上に反映されるようになります。

まずはphotoshop-python-apiを使用してPython環境でツールを起動したときに問題なく動作するツールを作成してください。

ツールを作成する際の注意点として、複数バージョンのPhotoshopがインストールされているPCで処理を実行する場合、photoshop-python-api処理時にバージョンの指定を行わないと正しく実行されないことがあります。

今回は後述のPhotoshopバージョンごとのツール起動スクリプトで環境変数を設定し、その環境変数をツール起動時に読み込むことでバージョンの指定を行います。
photoshop.Session(Photoshopとの接続処理)実行時にバージョン情報を指定する必要があるため、静的関数でバージョン情報を設定した後は常に同じバージョン情報を使用するクラスを作成しました。

__main__.py

# -*- coding: utf-8 -*-
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

from photoshop import api
from PySide6 import QtWidgets, QtCore

from photoshop_tool_sample import qt, utils

if __name__ == '__main__':
    qt_app = QtWidgets.QApplication(sys.argv)
    # 起動済みPhotoshopから起動用スクリプトで起動しているか確認
    ps_version = os.environ.get('__PS_VERSION', '')
    if not ps_version:
        dlg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning,
                                    'warning',
                                    'Photoshopの起動用スクリプトから実行してください。')
        dlg.setWindowFlags(dlg.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        dlg.exec()
        sys.exit(1)

    # 起動しているバージョンと環境変数のバージョンが一致しているか確認
    ps_app = api.Application()
    if int(ps_app.version[:2])-1 != int(ps_version[2:]):
        dlg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning,
                                    'warning',
                                    '起動用スクリプトのバージョンが正しくありません。')
        dlg.setWindowFlags(dlg.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        dlg.exec()
        sys.exit(1)

    utils.VersionSession.set_version(ps_version)
    win = qt.PhotoshopSampleTool()
    win.show()
    sys.exit(qt_app.exec())

utils.py

# -*- coding: utf-8 -*-
import photoshop
from PySide6 import QtWidgets, QtCore

class VersionSession(photoshop.Session):
    """Photoshopのバージョン情報を保持してSession作成
    """
    __PHOTOSHOP_VERSION = '2025'

    @staticmethod
    def set_version(ps_version):
        VersionSession.__PHOTOSHOP_VERSION = ps_version

    @staticmethod
    def get_version():
        return VersionSession.__PHOTOSHOP_VERSION

    def __init__(self):
        super(VersionSession, self).__init__(ps_version=VersionSession.__PHOTOSHOP_VERSION)

PyInstallerでexe形式にビルドするバッチ

Python環境で問題なく動作するツールが作成できた後は、そのツールをPython環境不要で起動できるようにするためPyInstallerでexe形式にビルドします。

build.bat

setlocal

cd /d %~dp0

::show console
::pyinstaller -D -y -n photoshop_tool_sample ../__main__.py
::hide console
pyinstaller -D -y -w -n photoshop_tool_sample ../__main__.py

endlocal

今回はPython環境でのツール起動スクリプトが__main__.pyのため、バッチファイル内で親階層の__main__.pyを指定しています。
別のファイルをツール起動スクリプトとした場合は、適宜書き換えて下さい。

ビルドが完了するとpy_installer/distに出力されたフォルダにツールのexeとその他必要なファイルが生成されます。

上記build.batの場合は-n引数でフォルダ・exeの名前を指定しているので、py_installer\dist\photoshop_tool_sample に以下のように出力されます。
配布の際には出力されたフォルダごと配布しましょう。

PY_INSTALLER\DIST
└─photoshop_tool_sample
    │  photoshop_tool_sample.exe
    │
    └─_internal
        └─exeを起動するのに必要な諸々のデータ

Photoshopバージョンごとのツール起動スクリプト

Photoshopからexe形式にビルドしたツールを起動したいので、Photoshopから実行するPhotoshopバージョンごとの起動用スクリプトを作成します。
前述のPython環境でのツール起動スクリプトでPhotoshopのバージョン情報を取得するため、この起動スクリプトで環境変数を設定します。

run_ver2025.jsx

// Photoshopから呼ばれるツール起動用スクリプト

var script_file = File($.fileName);

// Photoshopバージョン情報を環境変数に設定
$.setenv("__PS_VERSION", "2025")
var tool_exe = File(script_file.parent.fsName + "/py_installer/dist/photoshop_tool_sample/photoshop_tool_sample.exe");
tool_exe.execute();

その他の注意点

ツールの前面表示

今回のツールはjsxスクリプトから起動したとしても、実際には独立したexeがPhotoshopに接続して処理を行っている状態になります。
そのためツールがPhotoshopから起動する前提となっている場合は、Photoshop画面の後ろに隠れないように最前面フラグを有効化すると使いやすくなるかもしれません。

utils.py

class PhotoshopToolDialog(QtWidgets.QDialog):
    """Photoshopツール基本設定
    """
    def __init__(self, parent=None):
        super(PhotoshopToolDialog, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

まとめ

今回はPythonでPhotoshopのツールを作成する際の開発環境・パッケージ構成をまとめてみました。

Photoshopでツールを作る際の作成の参考になれば幸いです。

参考

GitHub - loonghao/photoshop-python-api: Python API for Photoshop.

Overview - Photoshop Python API

執筆者:菅原

インタラクティブコンテンツ制作会社を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にMayaツール開発の業務を担当。 好きな食べものはごはん。

ABOUT

モノリスソフト開発スタッフが日々取り組んでいる技術研究やノウハウをご紹介

RECRUIT採用情報