File size: 3,231 Bytes
d0f419a
 
 
 
 
 
 
 
 
99f802a
 
d0f419a
 
 
41d52be
 
d0f419a
 
 
 
 
41d52be
 
 
d0f419a
95ccd40
d0f419a
 
 
95ccd40
 
d0f419a
 
 
95ccd40
 
d0f419a
 
 
41d52be
 
 
 
 
 
 
 
 
d0f419a
41d52be
 
 
 
 
d0f419a
 
 
41d52be
 
99f802a
41d52be
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Generate sample data with 800x400 images of fonts in /System/Library/Fonts
# 50 images per font, 1 font per image

import os
from PIL import Image, ImageDraw, ImageFont
import nltk
from nltk.corpus import brown
import random

IMAGES_PER_FONT = 50

# Download the necessary data from nltk
nltk.download('brown')

# Note that this will only work on MacOS where this is the default font directory
font_dirs = ['/System/Library/Fonts/', '/System/Library/Fonts/Supplemental/']
output_dir = './font_images'
os.makedirs(output_dir, exist_ok=True)

all_brown_words = sorted(set(brown.words(categories='news')))

# This is a list of fonts that we want to use for our sample data
FONT_ALLOWLIST = ["Arial", "Avenir", "Courier", "Helvetica", "Georgia", "Tahoma", "Times New Roman", "Verdana"]

def wrap_text(text, line_length=10):
    """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(words, num_words=200):
    """Returns a random selection of 'num_words' words from the provided list of words."""
    random_words = " ".join(random.sample(words, num_words))
    return wrap_text(random_words)

def random_code_text(base_code, num_lines=15):
    """Returns a random selection of 'num_lines' lines from the provided code."""
    lines = base_code.split("\n")
    return "\n".join(random.sample(lines, min(num_lines, len(lines))))

for font_dir in font_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 not in FONT_ALLOWLIST:
                continue
            # Output the font name so we can see the progress
            print(font_path, font_name)

            if font_file.endswith('.ttc'):
                # ttc fonts have multiple fonts in one file, so we need to specify which one we want
                font = ImageFont.truetype(font_path, random.choice(range(32, 128)), index=0)
            else:
                # ttf fonts have only one font in the file
                font_size = random.choice(range(32, 128))  # Increased minimum font size
                font = ImageFont.truetype(font_path, font_size)

            # Counter for the image filename
            j = 0
            for i in range(IMAGES_PER_FONT):  # Generate 50 images per font - reduced to 10 for now to make things faster
                prose_sample = random_prose_text(all_brown_words)

                for text in [prose_sample]:
                    img = Image.new('RGB', (800, 400), color="white")  # Canvas size
                    draw = ImageDraw.Draw(img)

                    # Random offsets, but ensuring that text isn't too far off the canvas
                    offset_x = random.randint(-20, 10)
                    offset_y = random.randint(-20, 10)
                    draw.text((offset_x, offset_y), text, fill="black", font=font)

                    j += 1
                    output_file = os.path.join(output_dir, f"{font_name}_{j}.png")
                    img.save(output_file)