From 981d83da62d9580541db3cb24e1bce81b6f89ae1 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Tue, 23 Jan 2024 16:48:52 +0100 Subject: [PATCH] Upload transparency image --- g4f/image.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/g4f/image.py b/g4f/image.py index 61081ea1..94b8c24c 100644 --- a/g4f/image.py +++ b/g4f/image.py @@ -20,23 +20,23 @@ def to_image(image: ImageType, is_svg: bool = False) -> Image.Image: try: import cairosvg except ImportError: - raise RuntimeError('Install "cairosvg" package for open svg images') + raise RuntimeError('Install "cairosvg" package for svg images') if not isinstance(image, bytes): image = image.read() buffer = BytesIO() cairosvg.svg2png(image, write_to=buffer) - image = Image.open(buffer) + return Image.open(buffer) if isinstance(image, str): is_data_uri_an_image(image) image = extract_data_uri(image) if isinstance(image, bytes): is_accepted_format(image) - image = Image.open(BytesIO(image)) + return Image.open(BytesIO(image)) elif not isinstance(image, Image.Image): image = Image.open(image) copy = image.copy() copy.format = image.format - image = copy + return copy return image def is_allowed_extension(filename: str) -> bool: @@ -138,6 +138,7 @@ def process_image(img: Image.Image, new_width: int, new_height: int) -> Image.Im Returns: Image.Image: The processed image. """ + # Fix orientation orientation = get_orientation(img) if orientation: if orientation > 4: @@ -148,7 +149,14 @@ def process_image(img: Image.Image, new_width: int, new_height: int) -> Image.Im img = img.transpose(Image.ROTATE_270) if orientation in [7, 8]: img = img.transpose(Image.ROTATE_90) + # Resize image img.thumbnail((new_width, new_height)) + # Remove transparency + if img.mode != "RGB": + img.load() + white = Image.new('RGB', img.size, (255, 255, 255)) + white.paste(img, mask=img.split()[3]) + return white return img def to_base64(image: Image.Image, compression_rate: float) -> str: @@ -163,8 +171,6 @@ def to_base64(image: Image.Image, compression_rate: float) -> str: str: The base64-encoded image. """ output_buffer = BytesIO() - if image.mode != "RGB": - image = image.convert('RGB') image.save(output_buffer, format="JPEG", quality=int(compression_rate * 100)) return base64.b64encode(output_buffer.getvalue()).decode()