機能: Windows形式のドライブ相対パスを拒否し、連番の予約処理を原子的に実装 テスト: 出力ディレクトリとファイル連番に関するユニットテストを追加 バージョン: 0.1.3に更新
9.1 KiB
ComfyUI-GMImageSaver
ComfyUI用の、GraphicsMagickを利用した画像保存ノードです。
最初に収録されている GM Image JPEG Save は、JPEG保存に特化した出力ノードです。ComfyUIの IMAGE テンソルを中間PNGファイルへ書き出さず、GraphicsMagickへ直接ストリーミングしてJPEGへ変換します。プレビューや画像のパススルー出力は意図的に返しません。
特長
- GraphicsMagickによるテンソルからJPEGへの直接変換
- 中間PNGファイルを作成しないため、不要なディスクI/Oを削減
- JPEG専用、プレビューなしの出力ノード
- JPEG品質、クロマサブサンプリング、プログレッシブ形式を設定可能
- ファイル名やディレクトリ名へ任意のラベルを追加可能
- 日付、プレフィックス、ラベルを組み合わせたディレクトリ構成
- 任意の出力先ディレクトリに対応
- 長いプロンプトを含むUTF-8のJPEGコメントに対応
- 画像ごとにComfyUIのプログレスバーを更新
- フロントエンド、localStorage、HandpickerSuiteへの直接依存なし
オプションの label 入力には ckpt_name_safe などのCheckpoint名を接続できます。HandpickerSuite自体へ依存せず、疎結合なワークフローを構成できます。
動作要件
GraphicsMagickを別途インストールし、ComfyUIを起動する環境の PATH から gm コマンドを実行できるようにしてください。
次のコマンドで確認できます。
gm version
GraphicsMagickのインストール後や PATH の変更後は、ComfyUIを再起動してください。
Windows
コマンドラインツールを有効にしてGraphicsMagickをインストールします。ComfyUIを起動する環境と同じPowerShellまたはコマンドプロンプトで、gm version が成功することを確認してください。
Linux
ディストリビューションのパッケージマネージャーからGraphicsMagickをインストールします。DebianまたはUbuntuの場合:
sudo apt install graphicsmagick
gm version
インストール
このリポジトリをComfyUIの custom_nodes ディレクトリへクローンし、ComfyUIを再起動してください。
cd ComfyUI/custom_nodes
git clone https://github.com/ruminar/ComfyUI-GMImageSaver.git
ノード:GM Image JPEG Save
JPEGファイルの保存のみを行うノードです。プレビューや入力画像のパススルーは返しません。プレビューが必要な場合は、画像テンソルを別のPreview Imageノードへ分岐してください。
必須入力
images: ComfyUIのIMAGEテンソルまたは画像バッチfilename_prefix: ファイル名の接頭辞。既定値:imagedirectory_pattern: ディレクトリ構成。既定値:prefix/datefilename_date_format: ファイル名へ付加する日付形式。既定値:nonequality: 1~100のJPEG品質。既定値:80subsampling: クロマサブサンプリング。既定値:4:2:2progressive: プログレッシブJPEGを有効にするか。既定値:False
オプション入力
output_dir: 文字列ノードから接続する出力先のベースディレクトリlabel: Checkpoint名など、ファイル名とディレクトリ名へ追加するラベルcomment: JPEGのコメント領域へ保存する文字列
output_dir が未接続または空の場合は、ComfyUI標準のoutputディレクトリを使用します。相対パスは標準outputディレクトリの配下として解決され、絶対パスはその場所を直接使用します。親ディレクトリへの移動(..)を含む相対パスは拒否されます。C:foo や D:foo のようなWindows形式のドライブ相対パスも拒否されます。ComfyUIのoutput配下へ保存する場合は foo、絶対パスへ保存する場合は D:\foo のように指定してください。
JPEGコメントの処理
空でない comment が指定された場合、バッチごとにUTF-8の一時ファイルを1つ作り、GraphicsMagickへ -comment @<ファイル> の形式で渡します。これにより、GraphicsMagickのコマンドライン引数長制限や、Windowsの文字コード変換・コマンドライン長の問題を回避します。
- 一時ファイルはUTF-8、BOMなしで書き込みます。
- BOM文字、NUL文字、不要な制御文字、不正なUnicodeサロゲート文字を除去します。
- タブ、LF、CR、日本語、アクセント付き文字、絵文字は保持します。
- コメントはUTF-8で最大65,000バイトとし、正しい文字境界で切り詰めます。
- 同じバッチの全画像で同じ一時ファイルを再利用します。
- 正常終了、失敗、タイムアウトのいずれでも削除を試みます。
- コメントが未設定、空、または正規化後に空となる場合は一時ファイルを作りません。
GraphicsMagickはファイルから読み込んだコメントの改行をCRLFへ正規化し、末尾にもCRLFを追加します。行構造は保持されますが、入力とJPEG内コメントの完全なバイト一致は保証されません。
詳細な決定事項は .spec/comment-handling.md に記録しています。
ディレクトリパターン
directory_pattern は、output_dir の下に作成するディレクトリ構成を指定します。日付ディレクトリは常に yyyyMMdd 形式です。
選択可能なパターン:
none
date
prefix
prefix_date
prefix/date
label
label_date
label/date
prefix_label
prefix/label
prefix_label_date
prefix/label/date
prefix_date_label
prefix/date/label
入力例:
output_dir: D:\ComfyJPEG
filename_prefix: image
label: meinamix_v11
date: 20260601
生成されるディレクトリ:
none -> D:\ComfyJPEG
date -> D:\ComfyJPEG\20260601
prefix -> D:\ComfyJPEG\image
prefix_date -> D:\ComfyJPEG\image_20260601
prefix/date -> D:\ComfyJPEG\image\20260601
label -> D:\ComfyJPEG\meinamix_v11
label_date -> D:\ComfyJPEG\meinamix_v11_20260601
label/date -> D:\ComfyJPEG\meinamix_v11\20260601
prefix_label -> D:\ComfyJPEG\image_meinamix_v11
prefix/label -> D:\ComfyJPEG\image\meinamix_v11
prefix_label_date -> D:\ComfyJPEG\image_meinamix_v11_20260601
prefix/label/date -> D:\ComfyJPEG\image\meinamix_v11\20260601
prefix_date_label -> D:\ComfyJPEG\image_20260601_meinamix_v11
prefix/date/label -> D:\ComfyJPEG\image\20260601\meinamix_v11
label を含むパターンを使用する場合は、空でない label 入力が必要です。
ファイル名の日付形式
filename_date_format は、ディレクトリパターンとは独立してファイル名へ追加する日付部分を指定します。
none
yyyyMMdd
yyyyMMdd_HHmm
出力例:
image_0001.jpg
image_20260601_0001.jpg
image_20260601_1423_0001.jpg
image_meinamix_v11_0001.jpg
image_meinamix_v11_20260601_1423_0001.jpg
日時はノード実行時に一度だけ取得するため、同じバッチ内の画像には同じ日時部分が使用されます。連番は最低4桁になるようゼロ埋めされ、9999を超えて継続します。出力名は原子的に予約されるため、同時に保存する処理があっても既存JPEGを上書きせず、次の空き番号を使用します。
JPEG設定
既定値は画質とファイルサイズのバランスを重視しています。
quality: 80
subsampling: 4:2:2
progressive: False
保存・比較用途で高画質を優先する場合:
quality: 95
subsampling: 4:4:4
大量のCheckpointを確認する際にファイルサイズを抑える場合:
quality: 75~85
subsampling: 4:2:0
プレビューを使用する場合
このノードは意図的にプレビューを返しません。必要な場合は保存前に画像を分岐してください。
VAE Decode / IMAGE
├─ Preview Image
└─ GM Image JPEG Save
開発・テスト
Python 3.10以降で次のコマンドを実行します。
python -m unittest discover -s tests -v
合意済みの仕様と退行防止条件は .spec ディレクトリに記録しています。
プロジェクトの範囲
将来的にGraphicsMagickを用いた他の保存ノードを追加できるよう、プロジェクト名をGMImageSaverとしています。現在のノードは意図的に次の範囲へ絞っています。
- JPEG出力のみ
- プレビューおよび画像パススルーなし
- PNGサポートなし
- ワークフローメタデータの自動注入なし
- 外部プロジェクトへの直接依存なし
PNGで保存する場合は、ComfyUI標準のSave Imageノードを使用してください。
ライセンス
GPL-3.0。LICENSE を参照してください。