From 8bbabcc54e4b3ec57cb888c4a7adb2c526b33e79 Mon Sep 17 00:00:00 2001 From: "M. Sanaullah" Date: Sun, 18 Aug 2024 01:13:03 +0500 Subject: [PATCH] Update final_video.py Dynamically change the title card size based on the "Reddit" title lenght --- video_creation/final_video.py | 87 +++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/video_creation/final_video.py b/video_creation/final_video.py index 101d0f774..641b6ba82 100644 --- a/video_creation/final_video.py +++ b/video_creation/final_video.py @@ -108,19 +108,60 @@ def prepare_background(reddit_id: str, W: int, H: int) -> str: return output_path +def get_text_height(draw, text, font, max_width): + lines = textwrap.wrap(text, width=max_width) + total_height = 0 + for line in lines: + _, _, _, height = draw.textbbox((0, 0), line, font=font) + total_height += height + return total_height + def create_fancy_thumbnail(image, text, text_color, padding, wrap=35): + """ + It will take the 1px from the middle of the template and will be resized (stretched) vertically to accommodate the extra height needed for the title. + """ print_step(f"Creating fancy thumbnail for: {text}") font_title_size = 47 font = ImageFont.truetype(os.path.join("fonts", "Roboto-Bold.ttf"), font_title_size) image_width, image_height = image.size - lines = textwrap.wrap(text, width=wrap) - y = ( - (image_height / 2) - - (((getheight(font, text) + (len(lines) * padding) / len(lines)) * len(lines)) / 2) - + 30 - ) + + # Calculate text height to determine new image height draw = ImageDraw.Draw(image) + text_height = get_text_height(draw, text, font, wrap) + lines = textwrap.wrap(text, width=wrap) + # This are -50 to reduce the empty space at the bottom of the image, + # change it as per your requirement if needed otherwise leave it. + new_image_height = image_height + text_height + padding * (len(lines) - 1) - 50 + + # Separate the image into top, middle (1px), and bottom parts + top_part_height = image_height // 2 + middle_part_height = 1 # 1px height middle section + bottom_part_height = image_height - top_part_height - middle_part_height + + top_part = image.crop((0, 0, image_width, top_part_height)) + middle_part = image.crop((0, top_part_height, image_width, top_part_height + middle_part_height)) + bottom_part = image.crop((0, top_part_height + middle_part_height, image_width, image_height)) + + # Stretch the middle part + new_middle_height = new_image_height - top_part_height - bottom_part_height + middle_part = middle_part.resize((image_width, new_middle_height)) + + # Create new image with the calculated height + new_image = Image.new("RGBA", (image_width, new_image_height)) + + # Paste the top, stretched middle, and bottom parts into the new image + new_image.paste(top_part, (0, 0)) + new_image.paste(middle_part, (0, top_part_height)) + new_image.paste(bottom_part, (0, top_part_height + new_middle_height)) + + # Draw the title text on the new image + draw = ImageDraw.Draw(new_image) + y = top_part_height + padding + for line in lines: + draw.text((120, y), line, font=font, fill=text_color, align="left") + y += get_text_height(draw, line, font, wrap) + padding + # Draw the username "PlotPulse" at the specific position username_font = ImageFont.truetype(os.path.join("fonts", "Roboto-Bold.ttf"), 30) draw.text( (205, 825), @@ -130,39 +171,7 @@ def create_fancy_thumbnail(image, text, text_color, padding, wrap=35): align="left", ) - if len(lines) == 3: - lines = textwrap.wrap(text, width=wrap + 10) - font_title_size = 40 - font = ImageFont.truetype(os.path.join("fonts", "Roboto-Bold.ttf"), font_title_size) - y = ( - (image_height / 2) - - (((getheight(font, text) + (len(lines) * padding) / len(lines)) * len(lines)) / 2) - + 35 - ) - elif len(lines) == 4: - lines = textwrap.wrap(text, width=wrap + 10) - font_title_size = 35 - font = ImageFont.truetype(os.path.join("fonts", "Roboto-Bold.ttf"), font_title_size) - y = ( - (image_height / 2) - - (((getheight(font, text) + (len(lines) * padding) / len(lines)) * len(lines)) / 2) - + 40 - ) - elif len(lines) > 4: - lines = textwrap.wrap(text, width=wrap + 10) - font_title_size = 30 - font = ImageFont.truetype(os.path.join("fonts", "Roboto-Bold.ttf"), font_title_size) - y = ( - (image_height / 2) - - (((getheight(font, text) + (len(lines) * padding) / len(lines)) * len(lines)) / 2) - + 30 - ) - - for line in lines: - draw.text((120, y), line, font=font, fill=text_color, align="left") - y += getheight(font, line) + padding - - return image + return new_image def merge_background_audio(audio: ffmpeg, reddit_id: str):