from PIL import Image, ImageDraw, ImageFont def draw_text_in_box( image, text, box, font_path, max_font_size=100, min_font_size=10, fill="white", spacing=10, ): # another ai slop function draw = ImageDraw.Draw(image) x1, y1, x2, y2 = box box_width = x2 - x1 box_height = y2 - y1 def wrap_text(text, font): words = text.split() lines = [] current = "" for word in words: test = f"{current} {word}".strip() bbox = draw.textbbox((0, 0), test, font=font) width = bbox[2] - bbox[0] if width <= box_width: current = test else: if current: lines.append(current) current = word if current: lines.append(current) return lines for font_size in range(max_font_size, min_font_size - 1, -1): font = ImageFont.truetype(font_path, font_size) lines = wrap_text(text, font) line_heights = [] for line in lines: bbox = draw.textbbox((0, 0), line, font=font) line_heights.append(bbox[3] - bbox[1]) text_height = sum(line_heights) + spacing * (len(lines) - 1) if text_height <= box_height: break else: raise ValueError("Text is too long even at minimum font size") y = y1 + (box_height - text_height) / 2 for line, line_height in zip(lines, line_heights): bbox = draw.textbbox((0, 0), line, font=font) line_width = bbox[2] - bbox[0] x = x1 + (box_width - line_width) / 2 draw.text( (x, y), line, font=font, fill=fill, ) y += line_height + spacing def generate_quote(text: str): # basicaly just hard-coded values img = Image.open("assets/template.png").convert("RGB") draw_text_in_box( img, text, box=(721, 228, 1740, 951), font_path="assets/font.ttf", max_font_size=120, min_font_size=20, fill="white", spacing=30, ) return img if __name__ == "__main__": print("running test") img = Image.open("assets/template.png").convert("RGB") draw_text_in_box( img, "ЬБОПЛВОЛСМЧОЛБМСЧЮ.", box=(721, 228, 1740, 951), font_path="assets/font.ttf", max_font_size=120, min_font_size=20, fill="white", spacing=30, ) img.save("output.jpg") print("see output.jpg")