# utils.py import logging from PIL import Image, ImageDraw, ImageFont logger = logging.getLogger(__name__) def add_watermark(image_path: str, watermark_text: str) -> str: """ Adds a text watermark to an image and saves it over the original file. Args: image_path (str): The path to the input image. watermark_text (str): The text to use for the watermark. Returns: str: The path to the watermarked image (same as input). """ try: with Image.open(image_path).convert("RGBA") as base: # Create a transparent layer for the text txt_layer = Image.new("RGBA", base.size, (255, 255, 255, 0)) # Choose a font try: # Use a common system font if available font = ImageFont.truetype("arial.ttf", 40) except IOError: # Use a default font if the specific one isn't found logger.warning("Arial font not found. Using default PIL font.") font = ImageFont.load_default() # Get a drawing context d = ImageDraw.Draw(txt_layer) # Calculate the x,y coordinates of the text # We'll place it in the bottom right corner width, height = base.size textwidth, textheight = d.textbbox((0, 0), watermark_text, font=font)[2:] x = width - textwidth - 10 y = height - textheight - 10 # Draw text with a semi-transparent white color d.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128)) # Composite the text layer over the base image out = Image.alpha_composite(base, txt_layer) # Convert back to RGB and save over the original file out.convert("RGB").save(image_path, "PNG") logger.info(f"Watermark '{watermark_text}' added to {image_path}") return image_path except Exception as e: logger.error(f"Failed to add watermark to {image_path}: {e}") # Return the original path even if watermarking fails return image_path