Spaces:
Sleeping
Sleeping
| 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) | |