from PIL import Image, ImageDraw, ImageFont import os from typing import Optional, Tuple, Dict, Any def add_text_to_image( image_path: str, text: str, color: Optional[Tuple[int, int, int]] = None, output_name: Optional[str] = None ) -> Dict[str, Any]: """ 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. """ try: if color is None: color = (0, 0, 0) image = Image.open(image_path) draw = ImageDraw.Draw(image) font = ImageFont.load_default() text_width = draw.textlength(text, font=font) x = (image.width - text_width) / 2 y = image.height / 2 draw.text((x, y), text, fill=color, font=font) base_dir = os.path.dirname(image_path) base_name, ext = os.path.splitext(os.path.basename(image_path)) if output_name: new_filename = f"{output_name}{ext}" else: new_filename = f"{base_name}_edited{ext}" new_path = os.path.join(base_dir, new_filename) image.save(new_path) output_size = os.path.getsize(new_path) return { "success": True, "message": "Text added successfully to the image", "input_path": image_path, "output_path": new_path, "output_size_bytes": output_size, "text": text, "color": color } except Exception as e: return { "success": False, "error": str(e), "input_path": image_path, "output_path": None }