from PIL import Image, ImageDraw, ImageFont import os from typing import Optional, Tuple, Dict, Any def parse_color(color_str): if color_str.startswith('rgba('): values = color_str[5:-1].split(',') r = int(float(values[0])) g = int(float(values[1])) b = int(float(values[2])) return (r, g, b) elif color_str.startswith('rgb('): values = color_str[4:-1].split(',') r = int(float(values[0])) g = int(float(values[1])) b = int(float(values[2])) return (r, g, b) elif color_str.startswith('#'): return color_str else: return color_str def add_text_to_image_base64(image, text, x, y, font_size, color, centered=False): """ Adds centered text to an image and saves the result in the same folder. If no output_name is provided, '_edited' is appended to the original filename. If no color is provided, black is used by default. Args: image_path: Path to the original image. text: Text to write on the image. color: Optional RGB color of the text. Defaults to black. output_name: Optional output filename (without extension). Returns: Dictionary with success status and info. """ if image is None: return None img = image.copy() draw = ImageDraw.Draw(img) try: font = ImageFont.truetype("arial.ttf", font_size) except: try: font = ImageFont.truetype("/System/Library/Fonts/Arial.ttf", font_size) except: font = ImageFont.load_default() parsed_color = parse_color(color) if centered: bbox = draw.textbbox((0, 0), text, font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1] x = (img.width - text_width) // 2 y = (img.height - text_height) // 2 draw.text((x, y), text, fill=parsed_color, font=font) return img