Mercurial > ift6266
view data_generation/transformations/ttf2jpg.py @ 266:1e4e60ddadb1
Merge. Ah, et dans le dernier commit, j'avais oublié de mentionner que j'ai ajouté du code pour gérer l'isolation de différents clones pour rouler des expériences et modifier le code en même temps.
author | fsavard |
---|---|
date | Fri, 19 Mar 2010 10:56:16 -0400 |
parents | 1f5937e9e530 |
children | 7800be7bce66 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: iso-8859-1 -*- ''' Implementation of font image generator download fonts from http://www.dafont.com for exemple Author: Guillaume Sicard ''' import sys, os, fnmatch, random import Image, ImageFont, ImageDraw, numpy class ttf2jpg(): def __init__(self, font_file = ''): self.w = 32 self.h = 32 self.font_dir = '/Tmp/allfonts/' self.font_file = font_file self.image_dir = './images/' self.pattern = '*.ttf' self.char_list = [] for i in range(0,10): self.char_list.append(chr(ord('0') + i) ) for i in range(0,26): self.char_list.append(chr(ord('A') + i) ) for i in range(0,26): self.char_list.append(chr(ord('a') + i) ) files = os.listdir(self.font_dir) self.font_files = fnmatch.filter(files, '*.ttf') + fnmatch.filter(files, '*.TTF') # get font name def get_settings_names(self): return [self.font_file] # save an image def save_image(self,array, filename = ''): image = (array * 255.0).astype('int') image = Image.fromarray(image).convert('L') if (filename != ''): image.save(filename) else: image.show() # set a random font for character generation def set_random_font(self): i = random.randint(0, len(self.font_files) - 1) self.font_file = self.font_dir + self.font_files[i] # return a picture array of "text" with font "font_file" def create_image(self, text): # create a w x h black picture, and a drawing space image = Image.new('L', (self.w, self.h), 'Black') draw = ImageDraw.Draw(image) # load the font with the right size font = ImageFont.truetype(self.font_file, 28) d_w,d_h = draw.textsize(text, font=font) # write text and aligns it draw.text(((32 - d_w) / 2, ((32 - d_h) / 2)), text, font=font, fill='White') image = numpy.asarray(image) image = (image / 255.0).astype(numpy.float32) return image # write all the letters and numbers into pictures def process_font(self): for i in range(0, len(self.char_list) ): image = self.create_image(self.char_list[i]) self.save_image(image, self.image_dir + self.char_list[i] + '-' + os.path.basename(self.font_file) + '.jpg') sys.stdout.write('.') sys.stdout.flush() return (len(self.char_list)) # generate the character from the font_file and returns a numpy array def generate_image_from_char(self, character, font_file = ''): if (font_file != ''): self.font_file = font_file return self.create_image(character) # generate random character from random font file as a numpy array def generate_image(self): self.set_random_font() i = random.randint(0, len(self.char_list) - 1) return self.generate_image_from_char(self.char_list[i]), i # test method, create character images for all fonts in "font_dir" in dir "image_dir" def test(self): import time # look for ttf files files = os.listdir(self.font_dir) font_files = fnmatch.filter(files, self.pattern) # create "image_dir" if it doesn't exist if not os.path.isdir(self.image_dir): os.mkdir(self.image_dir) sys.stdout.write( str(len(font_files)) + ' fonts found, generating jpg images in folder ' + self.image_dir ) sys.stdout.flush() # main loop t = time.time() n = 0 for font_file in font_files: self.font_file = self.font_dir + font_file n += self.process_font() t = time.time() - t sys.stdout.write('\nall done!\n' + str(n) + ' images generated in ' + str(t) + 's (average : ' + str(1000 * t / n) + ' ms/im)\n') if __name__ == '__main__': myttf2jpg = ttf2jpg() #myttf2jpg.test() image, i = myttf2jpg.generate_image() myttf2jpg.save_image(image, '')