diff options
| author | navanchauhan <navanchauhan@gmail.com> | 2022-12-30 18:57:48 -0500 | 
|---|---|---|
| committer | navanchauhan <navanchauhan@gmail.com> | 2022-12-30 18:57:48 -0500 | 
| commit | 2272878b2cd7cee402ea22b0fecf89bf7692d89a (patch) | |
| tree | 8339850f9c343701ab2d3809f9acc522893da97c /helper_libs | |
| parent | 6601312a305adfe8db4b3ac0af01d705b19147fb (diff) | |
lib to write text on imgs
Diffstat (limited to 'helper_libs')
| -rw-r--r-- | helper_libs/image_utils.py | 125 | 
1 files changed, 125 insertions, 0 deletions
| diff --git a/helper_libs/image_utils.py b/helper_libs/image_utils.py new file mode 100644 index 0000000..70eaebb --- /dev/null +++ b/helper_libs/image_utils.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright 2011 Álvaro Justen [alvarojusten at gmail dot com] +# License: GPL <http://www.gnu.org/copyleft/gpl.html> + +from PIL import Image, ImageDraw, ImageFont + +class ImageText(object): +    def __init__(self, filename_or_size, mode='RGBA', background=(0, 0, 0, 0), +                 encoding='utf8'): +        if isinstance(filename_or_size, str): +            self.filename = filename_or_size +            self.image = Image.open(self.filename) +            self.size = self.image.size +        elif isinstance(filename_or_size, (list, tuple)): +            self.size = filename_or_size +            self.image = Image.new(mode, self.size, color=background) +            self.filename = None +        self.draw = ImageDraw.Draw(self.image) +        self.encoding = encoding + +    def line(self, shape, fill): +        self.draw.line(shape,fill=fill, width=10) + +    def save(self, filename=None): +        self.image.save(filename or self.filename) + +    def get_font_size(self, text, font, max_width=None, max_height=None): +        if max_width is None and max_height is None: +            raise ValueError('You need to pass max_width or max_height') +        font_size = 1 +        text_size = self.get_text_size(font, font_size, text) +        if (max_width is not None and text_size[0] > max_width) or \ +           (max_height is not None and text_size[1] > max_height): +            raise ValueError("Text can't be filled in only (%dpx, %dpx)" % \ +                    text_size) +        while True: +            if (max_width is not None and text_size[0] >= max_width) or \ +               (max_height is not None and text_size[1] >= max_height): +                return font_size - 1 +            font_size += 1 +            text_size = self.get_text_size(font, font_size, text) + +    def write_text(self, coords, text, font_filename, font_size=11, +                   color=(0, 0, 0), max_width=None, max_height=None): +        if isinstance(text, str): +            x,y = coords +            text = text#.decode(self.encoding) +        if font_size == 'fill' and \ +           (max_width is not None or max_height is not None): +            font_size = self.get_font_size(text, font_filename, max_width, +                                           max_height) +        text_size = self.get_text_size(font_filename, font_size, text) +        font = ImageFont.truetype(font_filename, font_size) +        if x == 'center': +            x = (self.size[0] - text_size[0]) / 2 +        if y == 'center': +            y = (self.size[1] - text_size[1]) / 2 +        self.draw.text((x, y), text, font=font, fill=color) +        return text_size + +    def get_text_size(self, font_filename, font_size, text): +        font = ImageFont.truetype(font_filename, font_size) +        return font.getsize(text) + +    def write_text_box(self, coords, text, box_width, font_filename, +                       font_size=11, color=(0, 0, 0), place='left', +                       justify_last_line=False): +        x,y = coords +        lines = [] +        line = [] +        words = text.split() +        for word in words: +            new_line = ' '.join(line + [word]) +            size = self.get_text_size(font_filename, font_size, new_line) +            text_height = size[1] +            if size[0] <= box_width: +                line.append(word) +            else: +                lines.append(line) +                line = [word] +        if line: +            lines.append(line) +        lines = [' '.join(line) for line in lines if line] +        height = y +        for index, line in enumerate(lines): +            height += text_height +            if place == 'left': +                self.write_text((x, height), line, font_filename, font_size, +                                color) +            elif place == 'right': +                total_size = self.get_text_size(font_filename, font_size, line) +                x_left = x + box_width - total_size[0] +                self.write_text((x_left, height), line, font_filename, +                                font_size, color) +            elif place == 'center': +                total_size = self.get_text_size(font_filename, font_size, line) +                x_left = int(x + ((box_width - total_size[0]) / 2)) +                self.write_text((x_left, height), line, font_filename, +                                font_size, color) +            elif place == 'justify': +                words = line.split() +                if (index == len(lines) - 1 and not justify_last_line) or \ +                   len(words) == 1: +                    self.write_text((x, height), line, font_filename, font_size, +                                    color) +                    continue +                line_without_spaces = ''.join(words) +                total_size = self.get_text_size(font_filename, font_size, +                                                line_without_spaces) +                space_width = (box_width - total_size[0]) / (len(words) - 1.0) +                start_x = x +                for word in words[:-1]: +                    self.write_text((start_x, height), word, font_filename, +                                    font_size, color) +                    word_size = self.get_text_size(font_filename, font_size, +                                                    word) +                    start_x += word_size[0] + space_width +                last_word_size = self.get_text_size(font_filename, font_size, +                                                    words[-1]) +                last_word_x = x + box_width - last_word_size[0] +                self.write_text((last_word_x, height), words[-1], font_filename, +                                font_size, color) +        return (box_width, height - y)
\ No newline at end of file | 
