2 from PIL import Image, ImageDraw, ImageFont
5 def drawbox(img, d, context, get_font_path):
6 for version in d['versions']:
7 if draw_version(img, version, context, get_font_path):
11 def split_to_lines(text, draw, font, max_width):
16 new_words.append(words.pop(0))
17 while len(new_words[-1]) == 1 and words:
18 new_words.append(words.pop(0))
19 new_words = ' '.join(new_words)
20 new_line = ' '.join([current, new_words]).strip()
21 width = draw.textsize(new_line, font=font)[0]
31 def draw_version(img, d, context, get_font_path):
32 # todo: do this in a subimg
36 img.size[0] - d.get('x', 0),
37 d.get('max-height', img.size[1] - d.get('y', 0)),
41 draw = ImageDraw.Draw(newimg)
43 for item in d['items']:
45 cursor += item['vskip']
46 text = item['text'].format(**context)
47 if item.get('uppercase'):
49 font = ImageFont.truetype(get_font_path(item['font-family']), item['font-size'])
50 max_width = item.get('max-width', newimg.size[0])
52 for line in split_to_lines(text, draw, font, max_width):
53 realheight = draw.textsize(line, font=font)[1]
54 if cursor + realheight > newimg.size[1]:
56 print('x', draw.text((0, cursor), line, font=font, fill=item.get('color')))
57 cursor += item['line-height']
59 img.paste(newimg, (d.get('x', 0), d.get('y', 0)), newimg)
63 def create_thumbnail(background_path, defn, context, get_font_path):
64 img = Image.open(background_path)
66 for boxdef in d['boxes']:
67 drawbox(img, boxdef, context, get_font_path)