initial
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
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
|
||||
|
||||
# Try font sizes from large to small
|
||||
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)
|
||||
|
||||
# Calculate total text height
|
||||
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")
|
||||
|
||||
# Draw each line centered
|
||||
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")
|
||||
Reference in New Issue
Block a user