Spaces:
Running
Running
| import requests | |
| from PIL import Image, ImageDraw, ImageFont | |
| from io import BytesIO | |
| import uuid | |
| # --- 1. SETUP: Define your data --- | |
| # Input and Output files | |
| template_path = 'template_natura_empty.jpg' | |
| output_path = f'{uuid.uuid4()}.png' | |
| # Image to place on the template | |
| # NOTE: Replace this with parameters | |
| product_image_url = 'https://production.na01.natura.com/on/demandware.static/-/Sites-natura-br-storefront-catalog/default/dw68595724/NATBRA-89834_1.jpg' | |
| product_name = "Homem Cor.agio" | |
| original_price = "De: R$ 399,00" | |
| final_price = "Por: R$ 167,92" | |
| coupon_code = "AGOSTOA" | |
| # --- 2. IMAGE PROCESSING --- | |
| try: | |
| # Load the base template image | |
| template_image = Image.open(template_path).convert("RGBA") | |
| # Fetch the product image from the URL | |
| response = requests.get(product_image_url) | |
| product_image_data = BytesIO(response.content) | |
| product_image = Image.open(product_image_data).convert("RGBA") | |
| # Define the position and size for the product image placeholder | |
| # These coordinates were estimated from your template (width, height) | |
| box_size = (442, 353) | |
| box_position = (140, 280) # (x, y) from top-left corner | |
| # --- KEY CHANGE 1: Resize image while preserving aspect ratio --- | |
| # The thumbnail method resizes the image to fit within the box_size | |
| # without changing its aspect ratio. It modifies the image in-place. | |
| product_image_resized = product_image.copy() # Work on a copy | |
| product_image_resized.thumbnail(box_size) | |
| # --- KEY CHANGE 2: Calculate position to center the image --- | |
| # Find the top-left corner to paste the image so it's centered in the box | |
| paste_x = box_position[0] + (box_size[0] - product_image_resized.width) // 2 | |
| paste_y = box_position[1] + (box_size[1] - product_image_resized.height) // 2 | |
| paste_position = (paste_x, paste_y) | |
| # Paste the resized product image onto the template | |
| template_image.paste(product_image_resized, paste_position, product_image_resized) | |
| # --- 3. TEXT DRAWING --- | |
| # Create a drawing context | |
| draw = ImageDraw.Draw(template_image) | |
| # Define fonts. For best results, download a font like 'Montserrat' and provide the path. | |
| # Using a default font if a specific one isn't found. | |
| try: | |
| font_name = ImageFont.truetype("Montserrat-Bold.ttf", 47) | |
| font_price_from = ImageFont.truetype("Montserrat-Regular.ttf", 28) | |
| font_price = ImageFont.truetype("Montserrat-Bold.ttf", 47) | |
| font_cupom = ImageFont.truetype("Montserrat-Bold.ttf", 33) | |
| except IOError: | |
| print("Arial font not found. Using default font.") | |
| font_bold = ImageFont.load_default() | |
| font_regular = ImageFont.load_default() | |
| font_price = ImageFont.load_default() | |
| font_cupom = ImageFont.load_default() | |
| # Define text colors | |
| white_color = "#FFFFFF" | |
| yellow_color = "#FEE161" # A yellow sampled from your design | |
| black_color = "#000000" | |
| # Add text to the image | |
| # The 'anchor="ms"' centers the text horizontally at the given x-coordinate | |
| # 1. Product Name | |
| draw.text((360, 710), product_name, font=font_name, fill=white_color, anchor="ms") | |
| # 2. Original Price | |
| draw.text((360, 800), original_price, font=font_price_from, fill=white_color, anchor="ms") | |
| # 3. Final Price | |
| draw.text((360, 860), final_price, font=font_price, fill=yellow_color, anchor="ms") | |
| # 4. Coupon Code | |
| draw.text((360, 993), coupon_code, font=font_cupom, fill=black_color, anchor="ms") | |
| # --- 4. SAVE THE FINAL IMAGE --- | |
| # Save the result as a PNG to preserve quality | |
| template_image.save(output_path) | |
| print(f"✨ Success! Image saved as '{output_path}'") | |
| except FileNotFoundError: | |
| print(f"Error: The template file '{template_path}' was not found.") | |
| except Exception as e: | |
| print(f"An error occurred: {e}") |