Spaces:
Running
Running
""" | |
This module contains a function to add text to an image with a bounding box. | |
""" | |
import textwrap | |
from PIL import Image, ImageDraw, ImageFont | |
import numpy as np | |
import cv2 | |
def add_text(image: np.ndarray, text: str, contour: np.ndarray): | |
""" | |
Add text to an image with a bounding box. | |
""" | |
font_path = "./fonts/fonts_animeace_i.ttf" | |
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) | |
draw = ImageDraw.Draw(pil_image) | |
x, y, w, h = cv2.boundingRect(contour) | |
line_height = 16 | |
font_size = 14 | |
wrapping_ratio = 0.075 | |
wrapped_text = textwrap.fill(text, width=int(w * wrapping_ratio), | |
break_long_words=True) | |
font = ImageFont.truetype(font_path, size=font_size) | |
lines = wrapped_text.split('\n') | |
total_text_height = (len(lines)) * line_height | |
while total_text_height > h: | |
line_height -= 2 | |
font_size -= 2 | |
wrapping_ratio += 0.025 | |
wrapped_text = textwrap.fill(text, width=int(w * wrapping_ratio), | |
break_long_words=True) | |
font = ImageFont.truetype(font_path, size=font_size) | |
lines = wrapped_text.split('\n') | |
total_text_height = (len(lines)) * line_height | |
# Vertical centering | |
text_y = y + (h - total_text_height) // 2 | |
for line in lines: | |
text_length = draw.textlength(line, font=font) | |
# Horizontal centering | |
text_x = x + (w - text_length) // 2 | |
draw.text((text_x, text_y), line, font=font, fill=(0, 0, 0)) | |
text_y += line_height | |
image[:, :, :] = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) | |