from pathlib import Path import fire from PIL import Image, ImageDraw, ImageFont from utils import KanaData class FontImageGenerator: def __init__( self, font_path="data/KiwiMaru-Regular.ttf", img_size=640, padding=100, y_offset=-200, font_color="#AAA", grid_width=15, grid_color="#EEE", grid_split=3, grid_bg_color="white", kana_data_path="data/kana-data.json", output_dir="data/images", bg_file_name="bg.png", char_dir_name="kana-chars", ): self.font_path = font_path self.output_dir = Path(output_dir) self.img_size = img_size self.y_offset = y_offset self.font_color = font_color self.grid_width = grid_width self.grid_color = grid_color self.grid_split = grid_split self.grid_bg_color = grid_bg_color self.kana_data = KanaData.load(kana_data_path) self.font = ImageFont.truetype(self.font_path, img_size - padding) self.bg_path = self.output_dir / bg_file_name self.char_dir = self.output_dir / char_dir_name self.char_dir.mkdir(parents=True, exist_ok=True) def generate(self): image, _ = self.create_grid() image.save(self.bg_path) for kana_char in self.kana_data.spell: if len(kana_char) == 1: self.create_font_image(kana_char) def create_font_image(self, char): image, draw = self.create_grid() bbox = draw.textbbox((0, 0), char, font=self.font) w = bbox[2] - bbox[0] h = bbox[3] - bbox[1] x = (self.img_size - w) / 2 y = (self.img_size - h) / 2 + self.y_offset draw.text((x, y), char, font=self.font, fill=self.font_color) image.save(self.char_dir / f"{char}.png") def create_grid(self): image = Image.new("RGB", (self.img_size, self.img_size), self.grid_bg_color) draw = ImageDraw.Draw(image) ver_line = [(0, 0), (0, self.img_size)] hor_line = [(0, 0), (self.img_size, 0)] draw.line(ver_line, fill=self.grid_color, width=self.grid_width) draw.line(hor_line, fill=self.grid_color, width=self.grid_width) cell_size = self.img_size // self.grid_split for i in range(self.grid_split): point = (i + 1) * cell_size ver_line = [(point, 0), (point, self.img_size)] hor_line = [(0, point), (self.img_size, point)] draw.line(ver_line, fill=self.grid_color, width=self.grid_width) draw.line(hor_line, fill=self.grid_color, width=self.grid_width) return image, draw if __name__ == "__main__": fire.Fire(FontImageGenerator)