Outlines
parent
5afd9656cc
commit
e5a6248600
|
@ -43,7 +43,7 @@ class ImageText(object):
|
||||||
text_size = self.get_text_size(font, font_size, text)
|
text_size = self.get_text_size(font, font_size, text)
|
||||||
|
|
||||||
def write_text(self, xy, text, font_filename, font_size=11,
|
def write_text(self, xy, text, font_filename, font_size=11,
|
||||||
color=(0, 0, 0), max_width=None, max_height=None):
|
color=(0, 0, 0), max_width=None, max_height=None, stroke_color = None, stroke_size = 0):
|
||||||
x, y = xy
|
x, y = xy
|
||||||
if isinstance(text, str):
|
if isinstance(text, str):
|
||||||
try:
|
try:
|
||||||
|
@ -60,7 +60,7 @@ class ImageText(object):
|
||||||
x = (self.size[0] - text_size[0]) / 2
|
x = (self.size[0] - text_size[0]) / 2
|
||||||
if y == 'center':
|
if y == 'center':
|
||||||
y = (self.size[1] - text_size[1]) / 2
|
y = (self.size[1] - text_size[1]) / 2
|
||||||
self.draw.text((x, y), text, font=font, fill=color)
|
self.draw.text((x, y), text, font=font, fill=color, stroke_width=stroke_size, stroke_fill=stroke_color)
|
||||||
return text_size
|
return text_size
|
||||||
|
|
||||||
def get_text_size(self, font_filename, font_size, text):
|
def get_text_size(self, font_filename, font_size, text):
|
||||||
|
@ -88,7 +88,7 @@ class ImageText(object):
|
||||||
|
|
||||||
def write_text_box(self, xy, text, box_width, font_filename,
|
def write_text_box(self, xy, text, box_width, font_filename,
|
||||||
font_size=11, color=(0, 0, 0), place='left',
|
font_size=11, color=(0, 0, 0), place='left',
|
||||||
justify_last_line=False):
|
justify_last_line=False, stroke_color = None, stroke_size = 0):
|
||||||
x, y = xy
|
x, y = xy
|
||||||
|
|
||||||
lines = []
|
lines = []
|
||||||
|
@ -113,23 +113,23 @@ class ImageText(object):
|
||||||
if place == 'left':
|
if place == 'left':
|
||||||
total_size = self.get_text_size(font_filename, font_size, line)
|
total_size = self.get_text_size(font_filename, font_size, line)
|
||||||
self.write_text((x, height), line, font_filename, font_size,
|
self.write_text((x, height), line, font_filename, font_size,
|
||||||
color)
|
color, stroke_color=stroke_color, stroke_size=stroke_size)
|
||||||
elif place == 'right':
|
elif place == 'right':
|
||||||
total_size = self.get_text_size(font_filename, font_size, line)
|
total_size = self.get_text_size(font_filename, font_size, line)
|
||||||
x_left = x + box_width - total_size[0]
|
x_left = x + box_width - total_size[0]
|
||||||
self.write_text((x_left, height), line, font_filename,
|
self.write_text((x_left, height), line, font_filename,
|
||||||
font_size, color)
|
font_size, color, stroke_color=stroke_color, stroke_size=stroke_size)
|
||||||
elif place == 'center':
|
elif place == 'center':
|
||||||
total_size = self.get_text_size(font_filename, font_size, line)
|
total_size = self.get_text_size(font_filename, font_size, line)
|
||||||
x_left = int(x + ((box_width - total_size[0]) / 2))
|
x_left = int(x + ((box_width - total_size[0]) / 2))
|
||||||
self.write_text((x_left, height), line, font_filename,
|
self.write_text((x_left, height), line, font_filename,
|
||||||
font_size, color)
|
font_size, color, stroke_color=stroke_color, stroke_size=stroke_size)
|
||||||
elif place == 'justify':
|
elif place == 'justify':
|
||||||
words = line.split()
|
words = line.split()
|
||||||
if (index == len(lines) - 1 and not justify_last_line) or \
|
if (index == len(lines) - 1 and not justify_last_line) or \
|
||||||
len(words) == 1:
|
len(words) == 1:
|
||||||
self.write_text((x, height), line, font_filename, font_size,
|
self.write_text((x, height), line, font_filename, font_size,
|
||||||
color)
|
color, stroke_color=stroke_color, stroke_size=stroke_size)
|
||||||
continue
|
continue
|
||||||
line_without_spaces = ''.join(words)
|
line_without_spaces = ''.join(words)
|
||||||
total_size = self.get_text_size(font_filename, font_size,
|
total_size = self.get_text_size(font_filename, font_size,
|
||||||
|
@ -146,7 +146,7 @@ class ImageText(object):
|
||||||
words[-1])
|
words[-1])
|
||||||
last_word_x = x + box_width - last_word_size[0]
|
last_word_x = x + box_width - last_word_size[0]
|
||||||
self.write_text((last_word_x, height), words[-1], font_filename,
|
self.write_text((last_word_x, height), words[-1], font_filename,
|
||||||
font_size, color)
|
font_size, color, stroke_color=stroke_color, stroke_size=stroke_size)
|
||||||
height += text_height
|
height += text_height
|
||||||
if total_size[0] > max_x_size:
|
if total_size[0] > max_x_size:
|
||||||
max_x_size = total_size[0]
|
max_x_size = total_size[0]
|
||||||
|
|
|
@ -9,6 +9,12 @@ import io
|
||||||
from image_utils import ImageText
|
from image_utils import ImageText
|
||||||
from os.path import exists
|
from os.path import exists
|
||||||
|
|
||||||
|
TEST_MODE = True
|
||||||
|
|
||||||
|
class ColorScheme:
|
||||||
|
BLACK = 0
|
||||||
|
WHITE_WITH_BLACK_BORDER = 1
|
||||||
|
|
||||||
def create_soy_vs_chad_meme(emoji1, emoji2, caption1, caption2):
|
def create_soy_vs_chad_meme(emoji1, emoji2, caption1, caption2):
|
||||||
LEFT_MARGIN_COLUMN = 20
|
LEFT_MARGIN_COLUMN = 20
|
||||||
CONTENT_COLUMN = 300
|
CONTENT_COLUMN = 300
|
||||||
|
@ -40,8 +46,22 @@ def create_soy_vs_chad_meme(emoji1, emoji2, caption1, caption2):
|
||||||
center_and_paste(base, right_image, (LEFT_MARGIN_COLUMN+CONTENT_COLUMN+MIDDLE_MARGIN_COLUMN,TOP_MARGIN_ROW), (CONTENT_COLUMN, IMAGE_ROW))
|
center_and_paste(base, right_image, (LEFT_MARGIN_COLUMN+CONTENT_COLUMN+MIDDLE_MARGIN_COLUMN,TOP_MARGIN_ROW), (CONTENT_COLUMN, IMAGE_ROW))
|
||||||
|
|
||||||
#Text regions
|
#Text regions
|
||||||
add_text(base, caption1, (CONTENT_COLUMN, TEXT_ROW), (LEFT_MARGIN_COLUMN, TOP_MARGIN_ROW+IMAGE_ROW+MIDDLE_MARGIN_ROW))
|
add_text_box(base,
|
||||||
add_text(base, caption2, (CONTENT_COLUMN, TEXT_ROW), (LEFT_MARGIN_COLUMN+CONTENT_COLUMN+MIDDLE_MARGIN_COLUMN, TOP_MARGIN_ROW+IMAGE_ROW+MIDDLE_MARGIN_ROW))
|
caption1,
|
||||||
|
(CONTENT_COLUMN, TEXT_ROW),
|
||||||
|
(LEFT_MARGIN_COLUMN, TOP_MARGIN_ROW+IMAGE_ROW+MIDDLE_MARGIN_ROW),
|
||||||
|
init_font_size=50,
|
||||||
|
align="cht",
|
||||||
|
font="impact.ttf",
|
||||||
|
color=ColorScheme.WHITE_WITH_BLACK_BORDER)
|
||||||
|
add_text_box(base,
|
||||||
|
caption2,
|
||||||
|
(CONTENT_COLUMN, TEXT_ROW),
|
||||||
|
(LEFT_MARGIN_COLUMN+CONTENT_COLUMN+MIDDLE_MARGIN_COLUMN, TOP_MARGIN_ROW+IMAGE_ROW+MIDDLE_MARGIN_ROW),
|
||||||
|
init_font_size=50,
|
||||||
|
align="cht",
|
||||||
|
font="impact.ttf",
|
||||||
|
color=ColorScheme.WHITE_WITH_BLACK_BORDER)
|
||||||
return add_watermark(base)
|
return add_watermark(base)
|
||||||
|
|
||||||
class WebcomicPanel():
|
class WebcomicPanel():
|
||||||
|
@ -152,7 +172,7 @@ def create_webcomic(layout : 'list[WebcomicPanel]'):
|
||||||
image.paste(panel.create_image(), (x*assumed_panel_x_size, y*assumed_panel_y_size))
|
image.paste(panel.create_image(), (x*assumed_panel_x_size, y*assumed_panel_y_size))
|
||||||
return add_watermark(image)
|
return add_watermark(image)
|
||||||
|
|
||||||
def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coordinates : tuple[int, int], font : str= "arial.ttf", init_font_size = 45, align :str = ""):
|
def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coordinates : tuple[int, int], font : str= "arial.ttf", init_font_size = 45, align :str = "", color = ColorScheme.BLACK):
|
||||||
if caption == "":
|
if caption == "":
|
||||||
return
|
return
|
||||||
if init_font_size == 0:
|
if init_font_size == 0:
|
||||||
|
@ -160,7 +180,15 @@ def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coo
|
||||||
return
|
return
|
||||||
region_x_size, region_y_size = region_size
|
region_x_size, region_y_size = region_size
|
||||||
line_image = ImageText((region_x_size, region_y_size))
|
line_image = ImageText((region_x_size, region_y_size))
|
||||||
actual_text_box_size = line_image.write_text_box((0,0), caption, region_x_size, font_size=init_font_size, font_filename=font)
|
if color == ColorScheme.BLACK:
|
||||||
|
fill_color = (0,0,0)
|
||||||
|
stroke = None
|
||||||
|
stroke_size = 0
|
||||||
|
if color == ColorScheme.WHITE_WITH_BLACK_BORDER:
|
||||||
|
fill_color = (255,255,255)
|
||||||
|
stroke = (0,0,0)
|
||||||
|
stroke_size = 3
|
||||||
|
actual_text_box_size = line_image.write_text_box((0,0), caption, region_x_size, font_size=init_font_size, font_filename=font, color=fill_color, stroke_color=stroke, stroke_size=stroke_size)
|
||||||
_, actual_text_box_y_size, input_text_block_x_size, actual_text_box_x_size = actual_text_box_size
|
_, actual_text_box_y_size, input_text_block_x_size, actual_text_box_x_size = actual_text_box_size
|
||||||
if actual_text_box_y_size <= region_y_size:
|
if actual_text_box_y_size <= region_y_size:
|
||||||
actual_paste_x_coordinates, actual_paste_y_coordinates = coordinates
|
actual_paste_x_coordinates, actual_paste_y_coordinates = coordinates
|
||||||
|
@ -174,9 +202,7 @@ def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coo
|
||||||
elif "b" in align:
|
elif "b" in align:
|
||||||
actual_paste_y_coordinates+=y_difference
|
actual_paste_y_coordinates+=y_difference
|
||||||
elif "cv" in align:
|
elif "cv" in align:
|
||||||
text_box_center_y_position = int(actual_text_box_y_size/2)
|
actual_paste_y_coordinates += int(y_difference/2)
|
||||||
region_center_y_position = int(region_y_size/2)
|
|
||||||
actual_paste_y_coordinates = region_center_y_position - text_box_center_y_position
|
|
||||||
|
|
||||||
if "l" in align:
|
if "l" in align:
|
||||||
#This is the default
|
#This is the default
|
||||||
|
@ -185,14 +211,16 @@ def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coo
|
||||||
|
|
||||||
actual_paste_x_coordinates+=x_difference
|
actual_paste_x_coordinates+=x_difference
|
||||||
elif "ch" in align:
|
elif "ch" in align:
|
||||||
text_box_center_x_position = int(actual_text_box_x_size/2)
|
actual_paste_x_coordinates += int(x_difference/2)
|
||||||
region_center_x_position = int(region_x_size/2)
|
|
||||||
actual_paste_x_coordinates = region_center_x_position - text_box_center_x_position
|
if TEST_MODE:
|
||||||
image_draw = ImageDraw.Draw(base)
|
image_draw = ImageDraw.Draw(base)
|
||||||
image_draw.rectangle(((actual_paste_x_coordinates, actual_paste_y_coordinates), (actual_paste_x_coordinates+actual_text_box_x_size, actual_text_box_y_size+actual_paste_y_coordinates)), fill="tan")
|
image_draw.rectangle((coordinates, (coordinates[0]+region_size[0], coordinates[1]+region_size[1])), fill="blue")
|
||||||
|
image_draw.rectangle(((actual_paste_x_coordinates, actual_paste_y_coordinates), (actual_paste_x_coordinates+actual_text_box_x_size, actual_text_box_y_size+actual_paste_y_coordinates)), fill="tan")
|
||||||
|
|
||||||
base.paste(line_image.image, (actual_paste_x_coordinates, actual_paste_y_coordinates), line_image.image)
|
base.paste(line_image.image, (actual_paste_x_coordinates, actual_paste_y_coordinates), line_image.image)
|
||||||
else:
|
else:
|
||||||
add_text_box(base, caption, region_size, coordinates, font=font, init_font_size=init_font_size-1)
|
add_text_box(base, caption, region_size, coordinates, font=font, init_font_size=init_font_size-1, align=align, color=color)
|
||||||
|
|
||||||
def add_text(base : Image, caption : str, region_size : tuple[int, int], coordinates : tuple[int, int], font : str= "arial.ttf"):
|
def add_text(base : Image, caption : str, region_size : tuple[int, int], coordinates : tuple[int, int], font : str= "arial.ttf"):
|
||||||
if caption == "":
|
if caption == "":
|
||||||
|
|
Loading…
Reference in New Issue