PngInfo 画像からプロンプトを取得する

png-infoを用いて画像からプロンプトを取得する

生成した画像からプロンプト

PNG PngImagePlugin にはメタデータを保存するチャンクがある。Python からも簡単に読み書き可能なので、ここに prompt を保存しておくと、あとから参照したいときに便利になる

img が PIL の Image だとして、save を呼びだしているとこに pnginfo というのを足してあげる。

書き込むコード

from PIL.PngImagePlugin import PngInfo
# ...
metadata = PngInfo()
metadata.add_text("prompt", "foo bar baz")
img.save("./outputs/0.png", pnginfo=metadata)

このコードは、Pillowライブラリを使用して、PNG画像のメタデータにテキスト情報を追加するために使用されます。具体的には、PngInfo()関数は、新しいPNG情報オブジェクトを作成します。このPNG情報オブジェクトは、PNG画像のメタデータを格納するために使用されます。

次に、metadata.add_text()関数は、PNG情報オブジェクトにテキスト情報を追加します。第1引数の”prompt”は、テキスト情報のキーであり、第2引数の”foo bar baz”は、実際のテキスト情報の値です。この例では、”prompt”というキーで、”foo bar baz”というテキスト情報がPNG情報オブジェクトに追加されます。

最後に、img.save()関数は、PNG画像を保存するために使用されます。第1引数の”./outputs/0.png”は、保存するファイルのパスです。第2引数のpnginfoには、PNG情報オブジェクトを指定することができます。この例では、先に作成されたPNG情報オブジェクトをpnginfo引数に渡して、PNG画像のメタデータにテキスト情報が含まれるようにしています。

つまり、このコードは、PNG画像のメタデータにテキスト情報を追加して、PNG画像を保存するために使用されます。これは、PNG画像に追加の情報を格納するために使用されることがあります。例えば、画像の撮影日時や場所など、重要な情報をPNG画像に含めることができます。

読み出しコード

#!/usr/bin/env python
import sys
from PIL import Image
from PIL.PngImagePlugin import PngInfo

img = Image.open(sys.argv[1])
print(img.text['prompt'])

このコードは、Pillowライブラリを使用して、PNG画像から”prompt”というキーで格納されたテキスト情報を取得しています。

具体的には、Image.open()関数を使用して、sys.argv[1]で指定されたPNG画像を開き、imgという名前のImageオブジェクトを作成しています。次に、img.text属性にアクセスすることで、PNG画像のメタデータに含まれるテキスト情報を取得しています。’prompt’をキーとする辞書の値を出力しています。

つまり、このコードは、指定されたPNG画像のメタデータに含まれる”prompt”というキーで格納されたテキスト情報を取得して、標準出力に出力するために使用されます。

JPG画像の場合

PNG画像と同様にPillowライブラリを使用してメタデータを追加することができます。しかし、JPG画像とPNG画像では、メタデータの格納方法が異なります。JPG画像では、Exifと呼ばれるフォーマットが一般的に使用されており、Exifフォーマットに従ってメタデータを保存する必要があります。

具体的には、PillowライブラリにはExif情報を扱うためのpiexifというモジュールがあります。piexifを使用すると、JPG画像のExif情報にテキスト情報を追加することができます。以下は、JPG画像にExif情報を追加する例です。

python
Copy code

from PIL import Image
from io import BytesIO
import piexif

# 画像の読み込み
img = Image.open("./input.jpg")

# Exif情報の取得
exif_dict = piexif.load(img.info["exif"])

# Exif情報にテキスト情報を追加
exif_dict["0th"][piexif.ImageIFD.XPTitle] = "foo bar baz"

# Exif情報をJPG画像に保存
exif_bytes = piexif.dump(exif_dict)
img.save("./output.jpg", "jpeg", exif=exif_bytes)

この例では、piexif.load()関数を使用して、JPG画像のExif情報を取得し、exif_dictという辞書に格納しています。次に、Exif情報にテキスト情報を追加するために、exif_dictに新しいキーと値を追加しています。例では、piexif.ImageIFD.XPTitleというキーに”foo bar baz”という値を設定しています。

最後に、piexif.dump()関数を使用して、更新されたExif情報をバイト列に変換し、JPG画像に保存します。img.save()関数の第3引数にexifを指定することで、JPG画像にExif情報を追加しています。