| import base64 | |
| import io | |
| from io import BytesIO | |
| from fastapi import APIRouter, Depends, FastAPI, HTTPException, Request, Response | |
| from modules.api.models import * | |
| from PIL import PngImagePlugin,Image | |
| import piexif | |
| import piexif.helper | |
| def decode_base64_to_image(encoding): | |
| if encoding.startswith("data:image/"): | |
| encoding = encoding.split(";")[1].split(",")[1] | |
| try: | |
| image = Image.open(BytesIO(base64.b64decode(encoding))) | |
| return image | |
| except Exception as err: | |
| raise HTTPException(status_code=500, detail="Invalid encoded image") | |
| def encode_pil_to_base64(image): | |
| with io.BytesIO() as output_bytes: | |
| if opts.samples_format.lower() == 'png': | |
| use_metadata = False | |
| metadata = PngImagePlugin.PngInfo() | |
| for key, value in image.info.items(): | |
| if isinstance(key, str) and isinstance(value, str): | |
| metadata.add_text(key, value) | |
| use_metadata = True | |
| image.save(output_bytes, format="PNG", pnginfo=(metadata if use_metadata else None), quality=opts.jpeg_quality) | |
| elif opts.samples_format.lower() in ("jpg", "jpeg", "webp"): | |
| parameters = image.info.get('parameters', None) | |
| exif_bytes = piexif.dump({ | |
| "Exif": { piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(parameters or "", encoding="unicode") } | |
| }) | |
| if opts.samples_format.lower() in ("jpg", "jpeg"): | |
| image.save(output_bytes, format="JPEG", exif = exif_bytes, quality=opts.jpeg_quality) | |
| else: | |
| image.save(output_bytes, format="WEBP", exif = exif_bytes, quality=opts.jpeg_quality) | |
| else: | |
| raise HTTPException(status_code=500, detail="Invalid image format") | |
| bytes_data = output_bytes.getvalue() | |
| return base64.b64encode(bytes_data) | |