|
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 |
|
} |
|
|