Files
るみなー先生 09e717ea00 仕様: 出力ディレクトリ処理とファイル連番の仕様書を追加し、関連するドキュメントを更新
機能: Windows形式のドライブ相対パスを拒否し、連番の予約処理を原子的に実装
テスト: 出力ディレクトリとファイル連番に関するユニットテストを追加
バージョン: 0.1.3に更新
2026-08-24 19:37:41 +09:00

230 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ComfyUI-GMImageSaver
[English](README.md) | [日本語](README.ja.md)
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` コマンドを実行できるようにしてください。
次のコマンドで確認できます。
```text
gm version
```
GraphicsMagickのインストール後や `PATH` の変更後は、ComfyUIを再起動してください。
### Windows
コマンドラインツールを有効にしてGraphicsMagickをインストールします。ComfyUIを起動する環境と同じPowerShellまたはコマンドプロンプトで、`gm version` が成功することを確認してください。
### Linux
ディストリビューションのパッケージマネージャーからGraphicsMagickをインストールします。DebianまたはUbuntuの場合:
```bash
sudo apt install graphicsmagick
gm version
```
## インストール
このリポジトリをComfyUIの `custom_nodes` ディレクトリへクローンし、ComfyUIを再起動してください。
```bash
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`: ファイル名の接頭辞。既定値:`image`
- `directory_pattern`: ディレクトリ構成。既定値:`prefix/date`
- `filename_date_format`: ファイル名へ付加する日付形式。既定値:`none`
- `quality`: 1~100のJPEG品質。既定値:`80`
- `subsampling`: クロマサブサンプリング。既定値:`4:2:2`
- `progressive`: プログレッシブ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`](.spec/comment-handling.md) に記録しています。
## ディレクトリパターン
`directory_pattern` は、`output_dir` の下に作成するディレクトリ構成を指定します。日付ディレクトリは常に `yyyyMMdd` 形式です。
選択可能なパターン:
```text
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
```
入力例:
```text
output_dir: D:\ComfyJPEG
filename_prefix: image
label: meinamix_v11
date: 20260601
```
生成されるディレクトリ:
```text
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` は、ディレクトリパターンとは独立してファイル名へ追加する日付部分を指定します。
```text
none
yyyyMMdd
yyyyMMdd_HHmm
```
出力例:
```text
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設定
既定値は画質とファイルサイズのバランスを重視しています。
```text
quality: 80
subsampling: 4:2:2
progressive: False
```
保存・比較用途で高画質を優先する場合:
```text
quality: 95
subsampling: 4:4:4
```
大量のCheckpointを確認する際にファイルサイズを抑える場合:
```text
quality: 75~85
subsampling: 4:2:0
```
## プレビューを使用する場合
このノードは意図的にプレビューを返しません。必要な場合は保存前に画像を分岐してください。
```text
VAE Decode / IMAGE
├─ Preview Image
└─ GM Image JPEG Save
```
## 開発・テスト
Python 3.10以降で次のコマンドを実行します。
```bash
python -m unittest discover -s tests -v
```
合意済みの仕様と退行防止条件は [`.spec`](.spec) ディレクトリに記録しています。
## プロジェクトの範囲
将来的にGraphicsMagickを用いた他の保存ノードを追加できるよう、プロジェクト名をGMImageSaverとしています。現在のノードは意図的に次の範囲へ絞っています。
- JPEG出力のみ
- プレビューおよび画像パススルーなし
- PNGサポートなし
- ワークフローメタデータの自動注入なし
- 外部プロジェクトへの直接依存なし
PNGで保存する場合は、ComfyUI標準のSave Imageノードを使用してください。
## ライセンス
GPL-3.0。[LICENSE](LICENSE) を参照してください。