stable-diffusion icon indicating copy to clipboard operation
stable-diffusion copied to clipboard

Store prompts/parameters in EXIF

Open sowbug opened this issue 3 years ago • 6 comments

It would be cool to (optionally) embed the information in each file's EXIF metadata needed to reproduce it. Having the seed and the prompt in the filename/folder is nice, but it's not always enough information, and if your --n_samples is larger than 1, then the prompt is no longer part of the filename, so individual files have even less metadata.

sowbug avatar Sep 02 '22 21:09 sowbug

Screenshot from 2022-09-02 15-18-35

Here's what it might look like. Other advantages:

  • No more worrying about whether the filename is valid if there are special characters in the prompt
  • Photo services can more easily index keywords that appear in EXIF, rather than hoping that they correctly extract keywords from the filename
  • If a photo-management app needs to rename or move the file, no valuable data is lost.

sowbug avatar Sep 02 '22 22:09 sowbug

Here is a Python snippet that works for PNG:

from libxmp import XMPFiles, consts, XMPMeta
import time

xmpfile = XMPFiles(file_path="PNG-metadata-test.png", open_forupdate=True)
xmp = xmpfile.get_xmp()
if xmp is None:
  xmp = XMPMeta()
xmp.append_array_item(consts.XMP_NS_DC, 'description', 'the time is %s' % time.asctime(), {'prop_array_is_ordered':True, 'prop_value_is_array':True})
xmpfile.put_xmp(xmp)
xmpfile.close_file()

On my Ubuntu Cinnamon system, this works as expected. Note that I needed to install libxml (pip install python-xmp-toolkit)

sowbug avatar Sep 05 '22 20:09 sowbug

Please take a look at 50d0f0eab52fda64b002092dd7525855c2b59d2d. It mostly does what I had in mind. Outstanding issues are listed in the commit message. Another issue I just thought of is that JSON might be a better format than str(argparse), because it's just as human-readable, but it's more machine-readable.

Anyway, this definitely scratches my own itch for now. If anyone else finds it useful, I'll be happy to turn it into a PR.

Screenshot from 2022-09-05 16-49-44

sowbug avatar Sep 05 '22 23:09 sowbug

Hi, sorry for the late reply, and thanks for adding this amazing feature; I will merge the commits as soon as possible. Thanks again!

basujindal avatar Sep 06 '22 07:09 basujindal

Please wait until I submit a PR, as I don't think the current implementation's quality is high enough. The problem is that installation of a certain required library is difficult, and I don't want you to incur a support load for anyone who runs into trouble.

sowbug avatar Sep 06 '22 17:09 sowbug

This is good to review. It works for both txt2img and img2txt, and JPEG and PNG file formats. It introduces no platform-specific dependencies. I've manually tested on Debian.

sowbug avatar Sep 06 '22 20:09 sowbug