Files

146 lines
13 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.
# 💙 ImageDir Preview (画像ディレクトリ参照プレビュー v0.3.1)
`ImageDir Preview` は、指定されたディレクトリから「特定のモデルが過去に出力した画像」だけを爆速で逆探知し、キャンバス上へ美しい一覧シートとして展開する「シャドウガーデンの超探知眼(目)」じゃ。
最大の特徴は、一般的なギャラリーツールのように重い「サムネイルデータベース」などを一切構築せず、**最新のタイムスタンプからサブディレクトリを再帰的に直接掘り進み、指定枚数に応じた最適な正方形グリッドへオンデマンドで画像を詰め込む** という、極めて軽量かつ実戦的な設計にあるのじゃ!
そしてv0.2.0の特大アップデートにより、ただ眺めるだけでなく**「画像に直接触れて運命を書き換える」**神機能をついに手に入れたのじゃ!
<img width="828" height="880" alt="image" src="https://github.com/user-attachments/assets/536085ab-8500-402a-ae63-381511ac626b" />
---
## 💎 v0.2.0の神機能:左クリック・アクションメニュー!
プレビューに展開された生きた画像を**「左クリック」**してみろ!専用のアクションメニューが浮かび上がるぞ!
* **🗑️ `Delete image`(画像の物理削除)**
失敗した生成画像(指が6本ある、顔が崩れている等)を見つけたら、これじゃ!確認ダイアログのあと、その場で元ファイルを物理削除するぞ。(削除後はレイアウトを崩さず「NO IMAGE」のプレビュー枠が残る洒落た仕様じゃ。クリックも無効化されるぞ)
モデルの格付けをしながら、ついでにゴミ画像のお掃除も完結してしまう最高の機能じゃ!
* **🖼️ `Set as checkpoint thumbnail`(代表サムネイル設定)**
「おおっ、この画像は神がかっている!」と思ったらこれじゃ!その生成画像を、一瞬で「そのCheckpointの代表サムネイル(サイドカー画像)」として上書き設定するぞ!これを設定すれば、`Checkpoint List Selector` の一覧でマウスホバーした時に美しくサムネイルがポップアップするようになる!もうCivitaiからわざわざプレビュー画像を拾ってくる必要はないのじゃ!
---
## 🔌 入出力仕様(Specifications)
### 📥 入力(Inputs)
* **`ckpt_name_str` (必須 / STRING):**
逆探知の鍵(ターゲット)となるCheckpointのファイルパス文字列。`Checkpoint List Selector`(頭脳)から無線バインドされることで、選んだモデルの画像を瞬時に引き出すぞ。
* **`search_directory` (任意 / STRING):**
画像を検索する対象ディレクトリのフルパス。
* *※未入力(空欄)の場合は、標準の `ComfyUI/output` フォルダを自動で参照する安心設計じゃ。*
* 💡 **【賢者の運用ハック】:** 標準の `output` フォルダだけでなく、**「別のストレージにディレクトリを掘って、PNGから軽量なJPEGに変換してアーカイブ保管したフォルダ」** などをここに直接指定することも可能じゃ!生成環境のディスクがカツカツでも、過去の遺産(JPEG)を別ドライブから優雅に参照しながら格付けを執行できるぞ。
* **`max_preview_images` (任意 / INT):**
一度に読み込んでコンタクトシートに配置する最大画像数(デフォルト: `12` / 範囲: `1〜80`)。
* **`hps_tab_id` (非表示 / STRING):**
ブラウザのタブを識別し、逆探知したコンタクトシートを「今操作している検分タブ」だけに正確に届ける(時空隔離)ための固有ID。
---
## 🎛 賢者のおすすめ:【枚数を絞った「大画面・爆速レスポンス」検分】
本ノードは、`max_preview_images` の値によって全体のレイアウト(グリッド)と画像のスケールを**動的に自動調整**する素晴らしいアビリティを持って記述されておる。
* **小枚数設定(例: 4枚〜12枚)★超推奨★**
表示する枚数を少なく絞ると、システムは1枚あたりの画像を「オリジナルのサイズを極限まで維持した巨大なパネル」としてグリッドにパッキングする。
これにより、生成されたキャラクターの指の造形、瞳のハイライト、背景の描き込みの甘さといった「細部のディテール」を、拡大鏡(ズーム)を使うことなくキャンバス上で一目で見分(ジャッジ)できるようになるのじゃ!
さらに、読み込むファイル数が少ないため、**ディスクI/Oやメモリへのデコード負荷が極めて軽くなり、操作のレスポンスがマッハで軽快になる**という最高の副加価値(ライフハック)もあるぞ!
* **大枚数設定(例: 24枚〜80枚)**
逆に枚数を多く設定すると、システムは全体のキャンバスが規定サイズ(`4096px`)を超えないよう、画像を綺麗に縮小(サムネイル化)して1枚のシートにギュッと詰め込む。
これは細部を見るのには向かんが、「このモデルは全体的にどんな色調や構図、絵柄の傾向を吐き出す癖があるのか」を、一歩引いた視点からオーバービュー(総覧)するのに極めて役立つぞ。
---
## 🧠 技術的深淵:【再帰的新着ソート & 浮動小数点を配した最適グリッド計算】
### 🛡️ 対応している画像フォーマット(拡張子)の結界
本ノードが逆探知(スキャン)の対象として認めている画像拡張子は以下の通り、主要なフォーマットを網羅しておる。
```python
# バックエンド側で厳密に弾く、安心のホワイトリスト方式じゃ!
ALLOWED_IMAGE_SUFFIXES = {".png", ".jpg", ".jpeg", ".webp"}
```
大容量かつメタデータ(プロンプト)が詰まったオリジナルの `.png` はもちろんのこと、おぬしが容量削減のために外部スクリプト等で変換した高圧縮な `.jpg` / `.jpeg` 、さらには次世代の `.webp` ファイルであっても、システムは何の差別もなくマッハで検知し、1枚の美しいシートへとパッキングしてみせるぞ!
### なぜ、重いインデックス管理もしていないのに、何万枚もあるフォルダから一瞬で画像を見つけ出し、しかも完全な正方形で並べられるのか?
市販の画像管理ソフトや重厚なギャラリープラグインは、起動時にフォルダ内のすべての画像を走査して「縮小版(サムネイルファイル)」をストレージに生成・保存し、専用のデータベースでインデックスを管理する。
しかし、これをComfyUIの環境で行うと、**毎日何万枚もの画像が出入りするフォルダの監視によってバックエンド(Python)が激重になり、サムネイルの書き出しによって結局SSDが摩耗してしまう**という本末転倒な事態を招く。
これをエレガントに回避するために、`ImageDir Preview` には **「タイムスタンプ逆順・再帰的オンデマンドスキャン」** と **「浮動小数点誤差回避(`EPS`)型の正方形グリッド・アルゴリズム」** という、2つの陰の叡智が組み込まれておるのじゃ!
#### ① サムネイル非作成・新着優先スキャン(No-Cache On-Demand Scan)
本ノードは、無駄なサムネイルキャッシュやデータベースを一切作らん。
Selectorから信号(Sync)を受け取ったその瞬間、指定された検索ルートから **「更新日時が新しいサブディレクトリ(Newest First)」** を優先して、再帰的にファイルツリーを高速でダイレクトに掘り進むのじゃ!
そして、ファイル名(ステム名)の中に「ターゲットとなるモデルの名前(セーフ文字列)」が含まれている画像を見つけた瞬間、必要な最大枚数に達するまでオンメモリで一気にハック(キャッチ)する。
「ユーザーが今見たいのは、過去の遺物ではなく、たった今実行したバッチの最新成果である」という事実に特化した、極めて無駄のない超高速な逆探知ロジックなのじゃよ。
#### ② 浮動小数点誤差を排した最速breakグリッド計算(Optimal Contact Sheet Packing)
キャッチした画像群を1枚のコンタクトシートに並べる際、システムは「もし1列なら? 2列なら?」と総当たりで全体の縦横比をシミュレーションする。
全体の `長辺 ÷ 短辺` が `1.0`(完全な正方形)に最も近くなる列数と行数の組み合わせ(ベストスコア)を瞬時に弾き出すのじゃ。
```python
# 【正方形グリッド計算の核心(Pythonバックエンド)】
current_raw_score = max(content_w, content_h) / min(content_w, content_h)
if current_raw_score < best_raw_score - EPS:
# パターン①:劇的にスコアが改善した(正方形に近づいた)→ 更新
best_raw_score = current_raw_score
...
elif abs(current_raw_score - best_raw_score) <= EPS:
# パターン②:浮動小数点の演算誤差を「EPS結界」で拾い、同点なら横長寄りを上書き採用!
best_raw_score = current_raw_score
...
else:
# パターン③:スコアが明確に悪化し始めた → これ以上ループを回すのは無駄なので即 break!
break
```
この計算時、Pythonのfloat型特有の微小な演算誤差によって判定がバグるのを防ぐため、内部では **`EPS = 1e-12`** というイプシロンの結界で同点判定(横長寄り優先)を安全に処理しておる。
さらに、列数を増やしていって**一度でも「正方形のピーク」を通り過ぎてスコアが悪化し始めたら、そこから先は横に伸び続けるだけであるため、無駄なループを即座に `break` して打ち切る**という超・最適化が行われておるのじゃ!
この計算速度はわずか数マイクロ秒。
どれほど中途半端な画像枚数が渡されようとも、一瞬で「ユーザーの視線移動(眼球の負担)が最小限に抑えられる、最も美しい正方形のコンタクトシート」へと完璧にパッキングされ、オンメモリでブラウザへと転送・描画されるのじゃよ!
<br/>
# 💖 おまけ
## 🤝 おすすめ画像出力ノード:GM Image JPEG Save
わしら『HandpickerSuite』と最高に相性の良い、公式(?)おすすめの画像出力ノードが爆誕したぞ!
その名も **[ComfyUI-GMImageSaver](https://github.com/ruminar/ComfyUI-GMImageSaver)** じゃ!
わしらとは完全に独立した(疎結合な)ノードじゃが、組み合わせた時のシナジーは絶大じゃ。騙されたと思って一緒に使ってみるのじゃ!
### ✨ 連携するとここがすごいぞ!
* **繋ぐだけで完璧な自動整理じゃ!**
HandpickerSuiteが出力する `ckpt_name_safe` を、GM Image JPEG Saveの `label` ピンにそのままワイヤーで繋ぐだけ!面倒な文字列加工ノードを間に挟む必要は一切ないぞ。
* **お好みの階層で美しく仕分け!**
保存時のパターンを選ぶだけで、Checkpoint名や日付を使った綺麗なディレクトリ階層を自動で構築して保存してくれるのじゃ。
* **深い階層もばっちり追いかけるぞ!**
GM Image JPEG Saveがどんなに深くフォルダを掘っても、わしら(HandpickerSuite)はしっかりその階層を追いかけて最新画像をプレビューするぞ。検分(棚卸し)のテンポは一切落ちぬ!
* **SSDに極限まで優しいエコ設計じゃ!**
Suiteのプレビュー機能と、このノードの直接JPEG保存を組み合わせることで、**中間ファイル(PNG)の作成を完全に撲滅**できる!おぬしらの大切なSSDの寿命をゴリゴリ削る悪習とはこれでおさらばじゃ!
* **堅牢無比なGraphicsMagick採用!**
出力エンジンには、重厚なImageMagickではなく、軽量で安定した「GraphicsMagick」を採用しておる。何千枚と回す夜間バッチの過酷な環境でも、安心して任せられるぞ。
* **棚卸し後のお楽しみ運用!**
ざっと棚卸しが終わったら、わしらSuiteのフィルタ機能で「お気に入り」のCheckpointだけを抽出するのじゃ。そしてGM Image JPEG Saveの画質(Quality)パラメータをガツンと上げて、極上の画像を収集して回る……なんていうロマン溢れる自動巡回も可能になるぞ!
単独でも強いが、組み合わせるともっと便利じゃ!ぜひお試しあれ!
### 📣 宣伝画像
<img width="1055" height="1491" alt="画像生成がもっと便利に!GMImageSaver紹介" src="https://github.com/user-attachments/assets/deb1f01c-d7fa-461d-b8e8-33df33d30ed7" />