log_formatter_pil.py
changeset 79 43ac75054d5c
child 80 a0662cff1d9d
equal deleted inserted replaced
78:85345abbd46a 79:43ac75054d5c
       
     1 """
       
     2     Use of PIL to render the image formatting stuff
       
     3 """
       
     4 
       
     5 from PIL import Image, ImageDraw, ImageFont
       
     6 
       
     7 from cStringIO import StringIO
       
     8 
       
     9 class PILImageFormatter (object) :
       
    10     """
       
    11         Implements the basic image-rendering operations on top of format_txt
       
    12     """
       
    13     
       
    14     # the font we load
       
    15     font = None
       
    16 
       
    17     def _load_font (self) :
       
    18         """
       
    19             Use the configured img_ttf_path for a TrueType font, or a default one
       
    20         """
       
    21 
       
    22         if self.font :
       
    23             pass
       
    24         
       
    25         elif self.img_ttf_path :
       
    26             # load truetype with configured size
       
    27             self.font = ImageFont.truetype(self.img_ttf_path, self.img_font_size)
       
    28 
       
    29         else :
       
    30             # default
       
    31             self.font = ImageFont.load_default()
       
    32 
       
    33         return self.font
       
    34 
       
    35     def format_png (self, lines, **kwargs) :
       
    36         # load font
       
    37         font = self._load_font()
       
    38 
       
    39         # build list of plain-text line data
       
    40         lines = list(data for line, data in self.format_txt(lines, **kwargs))
       
    41         
       
    42         # lines sizes
       
    43         line_sizes = [font.getsize(line) for line in lines]
       
    44 
       
    45         # figure out how wide/high the image will be
       
    46         width = max(width for width, height in line_sizes)
       
    47         height = sum(height for width, height in line_sizes)
       
    48 
       
    49         # create new B/W image
       
    50         img = Image.new('L', (width, height), 0xff)
       
    51 
       
    52         # drawer
       
    53         draw = ImageDraw.Draw(img)
       
    54         
       
    55         # starting offset
       
    56         offset_y = 0
       
    57 
       
    58         # draw the lines
       
    59         for line, (width, height) in zip(lines, line_sizes) :
       
    60             # draw
       
    61             draw.text((0, offset_y), line, font=font)
       
    62 
       
    63             # next offset
       
    64             offset_y += height
       
    65         
       
    66         # output buffer
       
    67         buf = StringIO()
       
    68 
       
    69         # save
       
    70         img.save(buf, 'png')
       
    71 
       
    72         # return data
       
    73         return buf.getvalue()
       
    74