From d836d1435fa0623b2cb54ab91b66ecddc9457458 Mon Sep 17 00:00:00 2001 From: Laurent Picard Date: Thu, 11 Dec 2025 16:09:09 +0100 Subject: [PATCH] fix(images): Ensure input image fidelity during serialization and transfer - Ensures local image serialization fidelity. - Guarantees lossless in-memory image transfers. --- google/genai/_transformers.py | 38 ++++++++++++++++------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/google/genai/_transformers.py b/google/genai/_transformers.py index 7c295cc5a..facb907f3 100644 --- a/google/genai/_transformers.py +++ b/google/genai/_transformers.py @@ -21,6 +21,7 @@ import inspect import io import logging +import pathlib import re import sys import time @@ -286,28 +287,23 @@ def t_caches_model( def pil_to_blob(img: Any) -> types.Blob: - PngImagePlugin: Optional[builtin_types.ModuleType] - try: - import PIL.PngImagePlugin - - PngImagePlugin = PIL.PngImagePlugin - except ImportError: - PngImagePlugin = None - - bytesio = io.BytesIO() - if ( - PngImagePlugin is not None - and isinstance(img, PngImagePlugin.PngImageFile) - or img.mode == 'RGBA' - ): - img.save(bytesio, format='PNG') + def _blob_from_file() -> Optional[types.Blob]: + filepath = pathlib.Path(getattr(img, 'filename', '')) + if not filepath.is_file(): + return None + # Return source bytes unchanged + image_bytes = filepath.read_bytes() + mime_type = img.get_format_mimetype() + return types.Blob(data=image_bytes, mime_type=mime_type) + + def _blob_from_lossless_memory_image() -> types.Blob: + image_io = io.BytesIO() + img.save(image_io, format='PNG') + image_bytes = image_io.getvalue() mime_type = 'image/png' - else: - img.save(bytesio, format='JPEG') - mime_type = 'image/jpeg' - bytesio.seek(0) - data = bytesio.read() - return types.Blob(mime_type=mime_type, data=data) + return types.Blob(data=image_bytes, mime_type=mime_type) + + return _blob_from_file() or _blob_from_lossless_memory_image() def t_function_response(