|
1 | 1 | import base64 |
2 | 2 | import io |
3 | 3 |
|
4 | | -from PIL import Image |
| 4 | +from PIL import Image, PngImagePlugin |
5 | 5 |
|
6 | 6 |
|
7 | | -def b64_img(image: Image): |
8 | | - buffered = io.BytesIO() |
9 | | - image.save(buffered, format="PNG") |
10 | | - img_base64 = "data:image/png;base64," + str( |
11 | | - base64.b64encode(buffered.getvalue()), "utf-8" |
12 | | - ) |
13 | | - return img_base64 |
| 7 | +def b64_img(image: Image) -> str: |
| 8 | + return "data:image/png;base64," + raw_b64_img(image) |
14 | 9 |
|
15 | 10 |
|
16 | | -def raw_b64_img(image: Image): |
| 11 | +def raw_b64_img(image: Image) -> str: |
17 | 12 | # XXX controlnet only accepts RAW base64 without headers |
18 | | - buffered = io.BytesIO() |
19 | | - image.save(buffered, format="PNG") |
20 | | - img_base64 = str(base64.b64encode(buffered.getvalue()), "utf-8") |
21 | | - return img_base64 |
| 13 | + with io.BytesIO() as output_bytes: |
| 14 | + metadata = None |
| 15 | + for key, value in image.info.items(): |
| 16 | + if isinstance(key, str) and isinstance(value, str): |
| 17 | + if metadata is None: |
| 18 | + metadata = PngImagePlugin.PngInfo() |
| 19 | + metadata.add_text(key, value) |
| 20 | + image.save(output_bytes, format="PNG", pnginfo=metadata) |
| 21 | + |
| 22 | + bytes_data = output_bytes.getvalue() |
| 23 | + |
| 24 | + return str(base64.b64encode(bytes_data), "utf-8") |
0 commit comments