"""
Use of PIL to render the image formatting stuff
"""
from PIL import Image, ImageDraw, ImageFont
from cStringIO import StringIO
class PILImageFormatter (object) :
"""
Mixin for LogFormatter that implements the basic image-rendering operations on top of format_txt
"""
# the font we load
font = None
def _load_font (self) :
"""
Use the configured img_ttf_path for a TrueType font, or a default one
"""
if self.font :
pass
elif self.img_ttf_path :
# load truetype with configured size
self.font = ImageFont.truetype(self.img_ttf_path, self.img_font_size)
else :
# default
self.font = ImageFont.load_default()
return self.font
def format_png (self, lines, **kwargs) :
# load font
font = self._load_font()
# build list of plain-text line data
lines = list(data for line, data in self.format_txt(lines, **kwargs))
# lines sizes
line_sizes = [font.getsize(line) for line in lines]
# figure out how wide/high the image will be
width = max(width for width, height in line_sizes)
height = sum(height for width, height in line_sizes)
# create new B/W image
img = Image.new('L', (width, height), 0xff)
# drawer
draw = ImageDraw.Draw(img)
# starting offset
offset_y = 0
# draw the lines
for line, (width, height) in zip(lines, line_sizes) :
# draw
draw.text((0, offset_y), line, font=font)
# next offset
offset_y += height
# output buffer
buf = StringIO()
# save
img.save(buf, 'png')
# return data
return buf.getvalue()