ComfyUI : Convert PNG to AVIF/WEBP and Keep Exif Prompt Metadata!
4 min readTired of storing Gigabytes of dumb PNG produced by ComfyUI or Stable Diffusion? Want to leverage the smooth, sweet low size of WebP or AVIF? ComfyUI is now able to load WebP and AVIF natively. No excuses to not convert all those dumb PNG to AVIF! But how do you keep the ConfyUI Prompt and ConfyUI Workflow from the PNG during conversion? Here is how (on Windows).
The Batch Script to Convert PNG to AVIF or WebP
Quick start for those who know what they are doing: here is the 2AVIF.cmd
script:
@echo OFF :: adjust where you Magick location is here. you can also just update the %PATH% variable. You also need exiftool.exe in the PATH anyway pushd %~sdp0..\PortableApps\Magick :: change to outputExt=webp for webp and rename the script. that's it! set outputExt=avif :: for similar visual quality: WebP=90 and AVIF=60 set quality=60 for %%f in (%*) DO call :convert %%f goto :end :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :convert IF /I "%~x1"==".%outputExt%" exit /b 0 magick convert -define %outputExt%:exif-properties=true -quality %quality% %1 "%~sdpn1.%outputExt%" IF /I "%~x1"==".png" ( call :extractTag Prompt %1 && call :addExifTag Prompt Make %1 call :extractTag Workflow %1 && call :addExifTag Workflow ImageDescription %1 ) goto :EOF :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :extractTag ComfyTag file echo :extractTag %* exiftool -struct -%1 -s3 %2 | busybox grep { >%TMP%\%1.txt set CR=%ERRORLEVEL% IF DEFINED DEBUG type %TMP%\%1.txt & pause exit /b %CR% goto :EOF :addExifTag ComfyTag ExifTag file echo :addExifTag %* <NUL set /p =%1: >%TMP%\%2.txt type %TMP%\%1.txt | busybox tr -d '\r\n' >>%TMP%\%2.txt exiftool -%2^<=%TMP%\%2.txt "%~sdpn3.%outputExt%" :: delete _original backup created by exiftool del /f /q "%~sdpn3.%outputExt%_original" exiftool -struct "%~sdpn3.%outputExt%" goto :EOF :end
- for WebP: rename it
2WEBP.cmd
and change setoutputExt=webp
and that’s it - you need exiftool.exe accessible in the PATH, or simple update the script with full path to exiftool
- Same for magick: either update the PATH variable, or change the location on the second line
Requirements
- Image Magick: I recommend the HDRI portable version
- just unzip somewhere and done
- exiftool
- just download the Windows zip, unzip and done
- busybox for the grep command
- download the latest Windows version from here
- Windows findstr.exe and find.exe can do the same but fail when the line is over 16,355 characters
How to Use
- create a shortcut to each of the 2 scripts
- move the shortcuts to the sendTo folder
- Then, simply select one or more PNG files, and right-click sendto > 2AVIF.cmd and boom done!
Explanations
for the curious mind, here is what’s happening under the hood.
PNG to AVIF conversion
The act of converting an image format to anopther is rather simple. The only quirks is the adding of quality compression settings, and keeping existing exif tags if any:
magick convert -define avif:exif-properties=true -quality 60 image.png image.avif
For WebP, simply swap avif
for webp
and that’s it. Magick cannot keep those Prompt and Workflow non-standard tags because, well, they are non-standard. It was a mistake from the start but since ComfyUI has become so huge, it’s now impossible to force the developer to start using Exif tags instead of those non-standard ones.
Retro-compatibility is a huge thing. They could simply keep them, and add actual Exif tags on top, but then it’s not my decision.
ComfyUI PNG Metadata to Exif Tag
When you generate an image, ComfyUI stores the JSON dump of its workflow and the prompt in 2 separate, non-standard custom PNG tags: Prompt and Workflow
If you know anything about Exif tags, you know these are non-standard and impossible to replicate in other formats. Other formats can only accept 3 kinds of metadata that I know of:
The easiest way to keep ComfyUI PNG metadata is to extract Those Prompt and Workflow tags with exiftool, and insert them as actual Exif tags in the new file. IFD (tag code) values should be next to each other. Why next to each other? Because otherwise they could be separated with other tags that will give ComfyUI a hard time to read through, when you load those images back into ComfyUI. More on how ComfyUI reads AVIF files with drag and drop here.
Which Exif IFD tag to use?
The maker of WAS Node Suite and Myself for 💾 Save Image Extended , have chosen those:
- Prompt: 0x010f = Make
- Workflow: 0x010e = ImageDescription
How To Extract Non-Standard PNG Metadata Tags?
Simply extract both Prompt and Workflow in a flat file:
exiftool -struct -Prompt -s3 image.png | busybox grep { >%TMP%\image.txt exiftool -struct -Workflow -s3 image.png | busybox grep { >%TMP%\image.txt
The grep part ensure we only keep the line with the JSON. Exiftool is a bit verbose.
How to Write Exif IFD Metadata into AVIF file?
We need to inject potentially 2 exif tags (workflow images don’t have the Prompt part) and these tags must be a flat JSON string, no carriage returns, no extra curly braces, no extra double quotes: Prompt: {value}
When we extracted the JSON from the non-standard PNG tags, we only got the value part. So we first create a blank file with the key part, and also avoid adding a carriage return at the end:
<NUL set /p =Prompt: >%TMP%\Make.txt
Next, we remove all carriage returns from the value we extracted prior, and add it to the whole tag we want to inject:
type %TMP%\Prompt.txt | busybox tr -d '\r\n' >>%TMP%\Make.txt
Next, we inject this tag into the file, in place, like so:
exiftool -Make^<=%TMP%\Make.txt image.avif
Finally, we delete the backup created by exiftool:
del /f /q image.avif_original
Any questions?