Download app.py from blind1234/img1: direct link, hf CLI and curl.
- Browser
- Download file 3.9 kB
-
https://huggingface.co/spaces/blind1234/img1/resolve/main/app.py
- Command line
-
hf download hf://spaces/blind1234/img1/app.py
-
curl -L -o app.py https://huggingface.co/spaces/blind1234/img1/resolve/main/app.py
3.9 kB
| import gradio as gr | |
| import numpy as np | |
| from PIL import Image, ImageDraw, ImageFont | |
| # Define a dictionary to map color names to their RGB values | |
| COLOR_MAP = { | |
| "white": (255, 255, 255), | |
| "black": (0, 0, 0), | |
| "red": (255, 0, 0), | |
| "green": (0, 255, 0), | |
| "blue": (0, 0, 255), | |
| "yellow": (255, 255, 0), | |
| "cyan": (0, 255, 255), | |
| "magenta": (255, 0, 255), | |
| } | |
| # Define the function to add text to the image | |
| def add_text_to_image(image, text, text_color, text_size, width, height, text_align, font): | |
| try: | |
| # Convert the image to a PIL Image object if it's not already | |
| if isinstance(image, np.ndarray): | |
| image = Image.fromarray(image.astype('uint8'), 'RGB') | |
| # Resize the image to the specified width and height while maintaining aspect ratio | |
| original_width, original_height = image.size | |
| aspect_ratio = original_width / original_height | |
| # Calculate new dimensions while maintaining aspect ratio | |
| if width / height > aspect_ratio: | |
| new_width = int(height * aspect_ratio) | |
| new_height = height | |
| else: | |
| new_width = width | |
| new_height = int(width / aspect_ratio) | |
| # Resize the image | |
| image = image.resize((new_width, new_height), Image.Resampling.LANCZOS) | |
| # Create a new blank image with the specified width and height | |
| new_image = Image.new("RGB", (width, height), (255, 255, 255)) # White background | |
| # Paste the resized image onto the new image, centered | |
| new_image.paste(image, ((width - new_width) // 2, (height - new_height) // 2)) | |
| # Create a drawing context | |
| draw = ImageDraw.Draw(new_image) | |
| # Load the font (you can specify a path to a .ttf file if needed) | |
| try: | |
| font = ImageFont.truetype(font, text_size) | |
| except IOError: | |
| # Fallback to a default font if the specified font is not available | |
| font = ImageFont.load_default() | |
| # Get the RGB color from the COLOR_MAP | |
| color_rgb = COLOR_MAP.get(text_color, (255, 255, 255)) # Default to white if color not found | |
| # Calculate text position based on alignment | |
| text_width, text_height = draw.textsize(text, font=font) | |
| if text_align == "left": | |
| text_position_x = 10 # 10 pixels from the left edge | |
| elif text_align == "right": | |
| text_position_x = width - text_width - 10 # 10 pixels from the right edge | |
| elif text_align == "center": | |
| text_position_x = (width - text_width) // 2 # Centered horizontally | |
| text_position_y = (height - text_height) // 2 # Centered vertically by default | |
| # Add the text to the image | |
| draw.text((text_position_x, text_position_y), text, fill=color_rgb, font=font) | |
| # Convert the image back to a numpy array for Gradio compatibility | |
| return np.array(new_image) | |
| except Exception as e: | |
| # Handle any errors and display a message | |
| print(f"Error: {e}") | |
| return None | |
| # Gradio interface | |
| iface = gr.Interface( | |
| fn=add_text_to_image, | |
| inputs=[ | |
| gr.Image(label="Input Image"), | |
| gr.Textbox(label="Text"), | |
| gr.Dropdown(label="Text Color", choices=list(COLOR_MAP.keys()), value="white"), | |
| gr.Slider(minimum=10, maximum=100, value=30, label="Text Size"), | |
| gr.Slider(minimum=100, maximum=2048, value=1024, label="Width"), | |
| gr.Slider(minimum=100, maximum=2048, value=1024, label="Height"), | |
| gr.Dropdown(label="Text Alignment", choices=["left", "right", "center"], value="center"), | |
| gr.Textbox(label="Font (e.g., 'arial.ttf')", value="arial.ttf") | |
| ], | |
| outputs=gr.Image(label="Output Image"), | |
| title="Add Text to Image", | |
| description="Upload an image, resize it, and add customizable text with alignment options." | |
| ) | |
| # Launch the Gradio app | |
| iface.launch() |