見出し画像

Stable Diffusion 過去に作った画像をメタデータ付きjpgに一括変換したい

毎度のことですが、しょーもないことをやらかしてます。

webuiのバージョンアップによってjpg出力を選べるようになったのは大変喜ばしいことだと思いました。1024x1024で作成しても画像サイズが150kB以内に収まります。
pngで同じサイズの画像作るとあっさり1MBを超えるのにね。10倍だぞ、10倍!
avif.. ? 知らんな


ディスクの断片化が気になるお年頃なので、さすがにアーカイブせざるを得ない。
とはいえ、作った画像が10000枚を超えるとアーカイブ1つにまとめるのは怖い。
(この界隈で10000枚は少ない方だと思うけど)
10GBのアーカイブなんて展開したくないわけですよ。ファイルの移動・コピーでエラー吐いたら心臓止まりそうになる。
そうなると必然的に1GBぐらいの分割アーカイブにしたくなるはずです。
え、ならない? そんなはずないだろ。 分かった、この話は止めよう。やめやめ。

さて、アーカイブを分割してしまった場合は別の問題が出てくる。
昔の画像を探すときにいちいち個別のアーカイブを開いて対象のファイル名で検索しなければいけないわけだ。ファイルリストだけ別個に作っておけば検索問題は解消できるけど、結局のところ画像が必要になった時に探すのが面倒くさい問題が無くならない。
そこで思ったわけだ。
過去に作った画像もjpg変換して小容量化してしまえば良いのに。
そうすれば容量が減るから1つのアーカイブにまとめても怖くない。

普通に画像変換するとPNGのメタデータは落ちてしまうんですよね。それは困る。
PNG info に放り込んだ時にプロンプトが読めないのでは残しておく意味がない。
さりとて、画像を消してプロンプトだけ残しておいても何だか分からないから困る。
jpg変換しつつメタデータの移行さえできれば…
探したらどっかにそういうソフトがあると思うんだけど知らないんだよね
勉強がてら自分で作るか。


お願いするリアリストさん。 可愛い


Extrasがあるやん

これならpng→jpgに変換しながらメタデータも移植してくれる。
Batch from Directory に放り込んで Resize = 1 で変換すればいい。
拡大1倍だったら処理も軽いし、すぐ終わるでしょ。

どうして……

なんかダメでした。
画像ファイル5枚だけにしてもダメ。なんで?? 前に使ったときは問題なかったのに
pytorchが変わったからなのかな。
よく分からない。原因を調べる気力もなくなってしまった。
何にしても、これだけメモリ食べるんだったら、処理にも時間かかるよね。
こっちには変換待ちの子たちが10000人待ってるんですよ。


壁にぶつかって痛がるリアリストさん。 可愛い


python キミに決めた!


ということでpythonに解決してもらいます。やることは「まったくカンタン」で
・任意のフォルダにpngファイルを入れる。
・メタデータを読み取る。
・jpg変換して、メタデータを再書き込みする。
これだけ

捕捉として
・pngファイルはサブディレクトリで小分けされている。
 出力結果もサブディレクトリごとに分けてほしい。
・jpgメタデータは PNG infoタブで読み取れる状態であってほしい。
・pillowでjpg変換して、piexifでメタデータを書き込めば良いんじゃないかな。

やることは簡単だと言ったが、作るのが簡単だとは言ってないぞ。
という感じでした。
まあ、なんだかんだで作れたんですが..
スクリプトファイルをベタ貼りするのはセキュリティ的にマズい予感がしたのでテキストファイルを貼ります。拡張子を .py に変えるだけで使えます。

使い方

フォルダに画像を入れて .py ファイルを起動するだけです。
webuiを使っているならpythonは入っているはず。pillow, piexif のインストールだけ忘れないように注意。

フォルダ構成はこう。

プログラム名の付け方って悩ましい

[1] まず、srcフォルダを作ってサブディレクトリごとpngをブチ込みます。
 ↓こんな感じになればOK。サブディレクトリ名、ファイル名は自由です。
 .\src\Sub1\picture1.png
 .\src\Sub1\picture2.png
 .\src\Sub1\picture3.png
 .\src\Sub2\picture1.png
 .\src\Sub2\picture2.png
 .\src\Sub2\picture3.png

[2] PNG_JPGconvert_wmeta.pyを起動するとoutputフォルダに結果が出ます。
[3] おわり

outputフォルダは自動生成される設定にしていたと思います。忘れました。
あらかじめ手動で作っておくと安心できます。

それと Log_pngmeta.txt というログファイルが勝手に出てきます。
たま~~にですが、変換できないメタデータを持ってる画像があるんですよね。
私の環境だと1000枚に1枚ぐらいでした。原因はよく分かりません。UnicodeDecodeErrorだったのでメタデータのバイナリが不正なようです。規則性がないのでさっぱりです。webuiのバージョンは関係なさそうなので、プロンプト内に使ってはいけない文字が入っていたのかもしれません。
ログで変換に失敗したファイルが分かるので、どうにかして手動変換してください。


ついでに

以前作った、ディレクトリ構成ごとファイル名一覧を書き出すバッチもここに貼っておきます。これまた .txt → .bat に変えれば動きます。
outputフォルダに入れて使うと良い感じに動くんじゃないでしょうか。


リアリストさんの出番を増やしたい。
というか何の脈絡もなくリアリストさん貼りまくってるけど、興味があれば前回の記事をご参照ください


終わり

python歴半年の素人が作ったものなので、不具合はいろいろあると思います。
お気づきの点がございましたらどんな些細な点でも我慢してください。
 動けばいいんだよ。こんなもんは。

念の為ですが、このファイルを使ったことでどんな問題が起きても私は関知しません。
自己責任でどうぞ。(免責事項というやつですね)

まあ中身を見てもらえば分かりますが、大した処理ではないんです。
PNG と JPG でメタデータの持ち方が違う というのが難しいポイントなだけで..

Q (急に) K (風が) F (吹いたので裾を押さえるリアリストさん)。 可愛い


またいつか

この記事が気に入ったらサポートをしてみませんか?