summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornavanchauhan <navanchauhan@gmail.com>2022-12-30 18:57:48 -0500
committernavanchauhan <navanchauhan@gmail.com>2022-12-30 18:57:48 -0500
commit2272878b2cd7cee402ea22b0fecf89bf7692d89a (patch)
tree8339850f9c343701ab2d3809f9acc522893da97c
parent6601312a305adfe8db4b3ac0af01d705b19147fb (diff)
lib to write text on imgs
-rw-r--r--helper_libs/image_utils.py125
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