from PIL import ( Image, ImageDraw ) import textwrap from utils.utils import load_image_from_url from utils.ext import ( ingredients as ext_ingredients, directions as ext_directions ) # from .utils import load_image_from_url # from .ext import ( # ingredients as ext_ingredients, # directions as ext_directions # ) def generate_food_with_logo_image(bg_path, logo_path, food_url, no_food="asset/frame/no_food.png"): bg = Image.open(bg_path) width, height = bg.size logo = Image.open(logo_path) logo_width, logo_height, logo_ratio, logo_rb, logo_mb = logo.size + (3, -20, 45) logo_width, logo_height = (logo_width // logo_ratio, logo_height // logo_ratio) logo = logo.resize((logo_width, logo_height)) food = load_image_from_url(food_url, rgba_mode=True, default_image=no_food) food_width, food_height = (300, 300) food = food.resize((food_width, food_height)) bg.paste(food, (0, 0), food) bg.paste(logo, (width - logo_width - logo_rb, height - logo_height - logo_mb), logo) return bg def generate_recipe_image( recipe_data, bg_path, food_logo_ia, fonts, bg_color="#ffffff" ): bg = Image.open(bg_path) bg.paste(food_logo_ia, (50, 50), food_logo_ia) bg_color = Image.new("RGBA", bg.size, bg_color) bg_color.paste(bg, mask=bg) im_editable = ImageDraw.Draw(bg_color) im_editable.text( (418, 30), textwrap.fill(recipe_data["title"], 15).replace(" \n", "\n"), (61, 61, 70), font=fonts["title"], ) im_editable.text( (100, 450), "Ingredients", (61, 61, 70), font=fonts["body_bold"], ) ingredients = recipe_data["ingredients"] ingredients = ext_ingredients(ingredients, [], without_mapping=True) ingredients = [textwrap.fill(item, 30).replace("\n", "\n ") for item in ingredients] im_editable.text( (50, 520), "\n".join([f"- {item}" for item in ingredients]), (61, 61, 70), font=fonts["body"], ) im_editable.text( (700, 450), "Directions", (61, 61, 70), font=fonts["body_bold"], ) directions = recipe_data["directions"] directions = ext_directions(directions) directions = [textwrap.fill(item, 70).replace("\n", "\n ").capitalize() for item in directions] im_editable.text( (430, 520), "\n".join([f"{i + 1}. {item}" for i, item in enumerate(directions)]).strip(), (61, 61, 70), font=fonts["body"], ) return bg_color