import random from pathlib import Path from PIL import Image, ImageDraw, ImageFont from io import BytesIO from base64 import b64encode number_of_rows = 15 number_of_columns = 15 target_number = 7 def count_seven_generator(): """Generating the count 7s tasks.""" numbers = "" for i in range(number_of_rows): for j in range(number_of_columns): random_val = random.randint(0, 9) numbers += str(random_val) if i != number_of_rows - 1: numbers += "\n" return dict(numbers=numbers, solution=int(numbers.count(str(target_number)))) TEXT_FONT = Path(__file__).parent / "assets" / "SF-Pro-Display-Regular.otf" TEXT_SIZE = 17 def generate_image(question: str, is_7er_task: bool = False) -> Image.Image: global TEXT_FONT, TEXT_SIZE font = ImageFont.truetype(str(TEXT_FONT), TEXT_SIZE) if is_7er_task: horizontal_padding = 2 vertical_padding = 3 items = question.split('\n') cell_widths = [] for item in items: bbox = font.getbbox(item) text_width = bbox[2] - bbox[0] cell_width = text_width + horizontal_padding cell_widths.append(cell_width) grid_cell_height = TEXT_SIZE + vertical_padding grid_width = int(max(cell_widths)) grid_height = grid_cell_height * len(items) image = Image.new("RGB", (grid_width, grid_height)) draw = ImageDraw.Draw(image) y_position = 0 for row_number, item in enumerate(items): cell_width = grid_width x = 0 mid_x = cell_width * 0.5 mid_y = grid_cell_height * 0.5 draw.rectangle([x, y_position, x + cell_width, y_position + grid_cell_height], fill="white") draw.text((x, y_position + mid_y), item, font=font, fill="black", anchor="lm") y_position += grid_cell_height return image else: horizontal_padding = 6 vertical_padding = 8 items = question.split(' ') cell_widths = [] for item in items: bbox = font.getbbox(item) text_width = bbox[2] - bbox[0] cell_width = text_width + horizontal_padding cell_widths.append(cell_width) grid_cell_height = TEXT_SIZE + vertical_padding grid_width = int(sum(cell_widths)) grid_height = int(grid_cell_height) image = Image.new("RGB", (grid_width, grid_height)) draw = ImageDraw.Draw(image) x_position = 0 for column_number, item in enumerate(items): cell_width = cell_widths[column_number] y = 0 mid_x = cell_width * 0.5 mid_y = grid_cell_height * 0.5 draw.rectangle([x_position, y, x_position + cell_width, y + grid_cell_height], fill="white") draw.text((x_position + mid_x, y + mid_y), item, font=font, fill="black", anchor="mm") x_position += cell_width return image def encode_image_to_base64(image: Image.Image) -> str: buffer = BytesIO() image.save(buffer, format="PNG") image_bytes = buffer.getvalue() base64_encoded = b64encode(image_bytes) data_uri = b"data:image/png;base64," + base64_encoded return data_uri.decode("ascii")