File size: 3,506 Bytes
94a7d52
 
 
 
 
df0eb35
94a7d52
 
 
 
 
 
 
 
 
 
 
 
 
df0eb35
94a7d52
 
 
df0eb35
94a7d52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df0eb35
 
94a7d52
 
df0eb35
 
 
94a7d52
 
 
 
f599b5b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from PIL import Image, ImageDraw, ImageFont
import requests
from io import BytesIO
import base64

class GenerateImageToolInput(BaseModel):
    """Input for the Generate Image Tool."""
    product_image_url: str = Field(..., description="URL of the product image to be placed on the template.")
    product_name: str = Field(..., description="Name of the product.")
    original_price: str = Field(..., description="Original price of the product.")
    final_price: str = Field(..., description="Final price of the product.")
    coupon_code: str = Field(..., description="Coupon code to be displayed on the image.")

import tempfile

class GenerateImageTool(BaseTool):
    name: str = "Generate Image Tool"
    description: str = "Generates a promotional image for a product using a template and returns the file path."
    args_schema = GenerateImageToolInput

    def _run(self, product_image_url: str, product_name: str, original_price: str, final_price: str, coupon_code: str) -> str:
        template_path = 'assets/template_1.png'

        try:
            template_image = Image.open(template_path).convert("RGBA")
            response = requests.get(product_image_url)
            product_image_data = BytesIO(response.content)
            product_image = Image.open(product_image_data).convert("RGBA")

            box_size = (442, 353)
            box_position = (140, 280)

            product_image_resized = product_image.copy()
            product_image_resized.thumbnail(box_size)

            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)

            template_image.paste(product_image_resized, paste_position, product_image_resized)

            draw = ImageDraw.Draw(template_image)

            try:
                font_name = ImageFont.truetype("assets/Montserrat-Bold.ttf", 47)
                font_price_from = ImageFont.truetype("assets/Montserrat-Regular.ttf", 28)
                font_price = ImageFont.truetype("assets/Montserrat-Bold.ttf", 47)
                font_cupom = ImageFont.truetype("assets/Montserrat-Bold.ttf", 33)
            except IOError:
                print("Arial font not found. Using default font.")
                font_name = ImageFont.load_default()
                font_price_from = ImageFont.load_default()
                font_price = ImageFont.load_default()
                font_cupom = ImageFont.load_default()

            white_color = "#FFFFFF"
            yellow_color = "#FEE161"
            black_color = "#000000"

            draw.text((360, 710), product_name, font=font_name, fill=white_color, anchor="ms")
            draw.text((360, 800), f"De: R$ {original_price}", font=font_price_from, fill=white_color, anchor="ms")
            draw.text((360, 860), f"Por: R$ {final_price}", font=font_price, fill=yellow_color, anchor="ms")
            draw.text((360, 993), coupon_code, font=font_cupom, fill=black_color, anchor="ms")

            with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as temp_file:
                template_image.save(temp_file.name)
                return temp_file.name

        except FileNotFoundError:
            return f"Error: The template file '{template_path}' was not found."
        except Exception as e:
            return f"An error occurred: {e}"