| """Image <-> bytes/base64 helpers shared by adapters.""" | |
| from __future__ import annotations | |
| import base64 | |
| import io | |
| from PIL import Image | |
| def to_jpeg_bytes(image: Image.Image, quality: int = 95) -> bytes: | |
| buf = io.BytesIO() | |
| image.convert("RGB").save(buf, format="JPEG", quality=quality) | |
| return buf.getvalue() | |
| def to_png_bytes(image: Image.Image) -> bytes: | |
| buf = io.BytesIO() | |
| image.save(buf, format="PNG") | |
| return buf.getvalue() | |
| def to_data_uri(image: Image.Image, fmt: str = "jpeg", quality: int = 90) -> str: | |
| """Encode an image as a data: URI for OpenAI-compatible image_url fields.""" | |
| if fmt == "jpeg": | |
| raw = to_jpeg_bytes(image, quality=quality) | |
| mime = "image/jpeg" | |
| else: | |
| raw = to_png_bytes(image) | |
| mime = "image/png" | |
| b64 = base64.b64encode(raw).decode("ascii") | |
| return f"data:{mime};base64,{b64}" | |