|
|
|
|
|
|
|
import os |
|
from PIL import Image, ImageDraw, ImageFont |
|
import nltk |
|
from nltk.corpus import brown |
|
import random |
|
from consts import FONT_ALLOWLIST, IMAGES_PER_FONT, GEN_IMAGES_DIR, FONT_FILE_DIRS, GOOGLE_FONTS_DIR |
|
|
|
|
|
nltk.download('inaugural') |
|
|
|
os.makedirs(GEN_IMAGES_DIR, exist_ok=True) |
|
|
|
def wrap_text(text, line_length=4): |
|
"""Wraps the provided text every 'line_length' words.""" |
|
words = text.split() |
|
return "\n".join([" ".join(words[i:i+line_length]) for i in range(0, len(words), line_length)]) |
|
|
|
def random_prose_text(line_length=4): |
|
"""Returns a random snippet from the Gutenberg corpus.""" |
|
corpus = nltk.corpus.inaugural.raw() |
|
start = random.randint(0, len(corpus) - 800) |
|
end = start + 800 |
|
return wrap_text(corpus[start:end], line_length=line_length) |
|
|
|
def main(): |
|
|
|
font_files = [] |
|
|
|
for font_file in os.listdir(GOOGLE_FONTS_DIR): |
|
if font_file.endswith('.ttf') or font_file.endswith('.ttc'): |
|
font_path = os.path.join(GOOGLE_FONTS_DIR, font_file) |
|
font_name = font_file.split('.')[0] |
|
font_files.append((font_path, font_name)) |
|
|
|
|
|
for font_dir in FONT_FILE_DIRS: |
|
for font_file in os.listdir(font_dir): |
|
if font_file.endswith('.ttf') or font_file.endswith('.ttc'): |
|
font_path = os.path.join(font_dir, font_file) |
|
font_name = font_file.split('.')[0] |
|
if font_name in FONT_ALLOWLIST: |
|
font_files.append((font_path, font_name)) |
|
|
|
|
|
for font_path, font_name in font_files: |
|
|
|
print(font_path, font_name) |
|
|
|
|
|
|
|
j = 0 |
|
for i in range(IMAGES_PER_FONT): |
|
|
|
font_size = random.choice(range(18, 72)) |
|
|
|
if font_path.endswith('.ttc'): |
|
|
|
font = ImageFont.truetype(font_path, font_size, index=0) |
|
else: |
|
|
|
font = ImageFont.truetype(font_path, font_size) |
|
|
|
|
|
font_avg_char_width = font.getbbox('x')[2] |
|
words_per_line = int(800 / (font_avg_char_width*5)) |
|
prose_sample = random_prose_text(line_length=words_per_line) |
|
|
|
for text in [prose_sample]: |
|
img = Image.new('RGB', (800, 400), color="white") |
|
draw = ImageDraw.Draw(img) |
|
|
|
|
|
offset_x = random.randint(-20, 10) |
|
offset_y = random.randint(-20, 10) |
|
|
|
|
|
line_height = random.uniform(0, 1.25) * font_size |
|
draw.text((offset_x, offset_y), text, fill="black", font=font, spacing=line_height) |
|
|
|
j += 1 |
|
output_file = os.path.join(GEN_IMAGES_DIR, f"{font_name}_{j}.png") |
|
img.save(output_file) |
|
|
|
if __name__ == '__main__': |
|
main() |