centering and such

master
HeyMoon 2022-08-12 18:13:18 -05:00
parent f77c9c09c6
commit 5afd9656cc
3 changed files with 40 additions and 29 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
__pycache__/image_utils.cpython-39.pyc __pycache__/image_utils.cpython-39.pyc
emoji_cache/
*.ttf

View File

@ -72,7 +72,7 @@ class ImageText(object):
justify_last_line=False): justify_last_line=False):
font_size = start_font_size font_size = start_font_size
while True: while True:
width, height, box_width = self.write_text_box(xy, text, box_width, width, height, box_width, _ = self.write_text_box(xy, text, box_width,
font_filename, font_size, color, place) font_filename, font_size, color, place)
if (width >= box_width) or (height >= box_height): if (width >= box_width) or (height >= box_height):
@ -108,6 +108,7 @@ class ImageText(object):
lines = [' '.join(line) for line in lines if line] lines = [' '.join(line) for line in lines if line]
height = y height = y
max_x_size = -1
for index, line in enumerate(lines): for index, line in enumerate(lines):
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)
@ -147,4 +148,6 @@ class ImageText(object):
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)
height += text_height height += text_height
return (total_size[0], height - y, box_width) if total_size[0] > max_x_size:
max_x_size = total_size[0]
return (total_size[0], height - y, box_width, max_x_size)

View File

@ -55,27 +55,28 @@ class WebcomicPanel():
return Image.new(mode="RGB", size=(self.PANEL_SIZE,self.PANEL_SIZE), color=(255,255,255)) return Image.new(mode="RGB", size=(self.PANEL_SIZE,self.PANEL_SIZE), color=(255,255,255))
class OneCharacterWebcomicPanel(WebcomicPanel): class OneCharacterWebcomicPanel(WebcomicPanel):
def __init__(self, emoji, caption): def __init__(self, emoji, caption, words_in_background):
self.emoji = emoji self.emoji = emoji
self.caption = caption self.caption = caption
self.words_in_background = words_in_background
def create_image(self) -> Image: def create_image(self) -> Image:
base = super().create_image() base = super().create_image()
panel_size_x, panel_size_y = base.size panel_size_x, panel_size_y = base.size
# We put the text in the background of the panel.
text_region_x_size = int(panel_size_x)
text_region_y_size = int(panel_size_y if self.words_in_background else panel_size_y/2)
add_text(base, self.caption, (text_region_x_size, text_region_y_size), (0,0), font=super().FONT)
# We put marsey in the bottom left quadrant # We put marsey in the bottom left quadrant
emoji_region_x_size = int(panel_size_x/2) emoji_region_x_size = int(panel_size_x)
emoji_region_y_size = int(panel_size_y/2) emoji_region_y_size = int(panel_size_y/2)
emoji_placement_position_x = 0 emoji_placement_position_x = 0
emoji_placement_position_y = int(panel_size_y/2) emoji_placement_position_y = int(panel_size_y/2)
emoji = get_emoji_from_rdrama(self.emoji) emoji = get_emoji_from_rdrama(self.emoji)
center_and_paste(base, emoji, (emoji_placement_position_x, emoji_placement_position_y), (emoji_region_x_size, emoji_region_y_size)) center_and_paste(base, emoji, (emoji_placement_position_x, emoji_placement_position_y), (emoji_region_x_size, emoji_region_y_size))
# We put the text in the top half of the panel.
text_region_x_size = int(panel_size_x)
text_region_y_size = int(panel_size_y/2)
add_text(base, self.caption, (text_region_x_size, text_region_y_size), (0,0), font=super().FONT)
return add_border_to_image(base) return add_border_to_image(base)
class TwoCharacterWebcomicPanel(WebcomicPanel): class TwoCharacterWebcomicPanel(WebcomicPanel):
@ -134,7 +135,7 @@ class TitleCardWebcomicPanel(WebcomicPanel):
def create_image(self) -> Image: def create_image(self) -> Image:
base = super().create_image() base = super().create_image()
add_text(base, self.caption, base.size, (0,0), font=super().FONT) add_text_box(base, self.caption, base.size, (0,0), font=super().FONT, init_font_size=90, align="cvch")
return add_border_to_image(base) return add_border_to_image(base)
@ -160,25 +161,35 @@ def add_text_box(base : Image, caption : str, region_size : tuple[int, int], coo
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) actual_text_box_size = line_image.write_text_box((0,0), caption, region_x_size, font_size=init_font_size, font_filename=font)
actual_text_box_x_size, actual_text_box_y_size, input_text_block_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
if align != "": if align != "":
y_difference = region_y_size - actual_text_box_y_size
x_difference = region_x_size - actual_text_box_x_size
# Horizontal Align # Horizontal Align
if "t" in align: if "t" in align:
#This is the default #This is the default
pass pass
elif "b" in align: elif "b" in align:
y_difference = region_y_size - actual_text_box_y_size
actual_paste_y_coordinates+=y_difference actual_paste_y_coordinates+=y_difference
elif "cv" in align:
text_box_center_y_position = int(actual_text_box_y_size/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
pass pass
elif "r" in align: elif "r" in align:
x_difference = region_x_size - actual_text_box_x_size
actual_paste_x_coordinates+=x_difference actual_paste_x_coordinates+=x_difference
elif "ch" in align:
text_box_center_x_position = int(actual_text_box_x_size/2)
region_center_x_position = int(region_x_size/2)
actual_paste_x_coordinates = region_center_x_position - text_box_center_x_position
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")
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)
@ -227,11 +238,6 @@ def center_and_paste(base : Image, to_paste : Image, coordinates: tuple[int, int
base.paste(to_paste, (x, y), to_paste) base.paste(to_paste, (x, y), to_paste)
def add_border_to_image(image : Image, thickness : int = 5): def add_border_to_image(image : Image, thickness : int = 5):
# image_draw = ImageDraw.Draw(image)
# image_x_size, image_y_size = image.size
# inner_rectangle_x_size, inner_rectangle_y_size = image_x_size - 2*thickness, image_y_size - 2*thickness
# image_draw.rectangle([(0,0),(image_x_size, image_y_size)], fill="black")
# image_draw.rectangle([(thickness, thickness),(image_x_size-thickness, image_y_size-thickness)], fill="white")
inner_image_x_size, inner_image_y_size = image.size inner_image_x_size, inner_image_y_size = image.size
outer_image_x_size, outer_image_y_size = inner_image_x_size + 2*thickness, inner_image_y_size + 2*thickness outer_image_x_size, outer_image_y_size = inner_image_x_size + 2*thickness, inner_image_y_size + 2*thickness
outside_image = Image.new(mode="RGB", size=(outer_image_x_size,outer_image_y_size), color=(0,0,0)) outside_image = Image.new(mode="RGB", size=(outer_image_x_size,outer_image_y_size), color=(0,0,0))
@ -266,13 +272,13 @@ def get_image_file_from_url(url):
im = Image.open(image_file) im = Image.open(image_file)
return im return im
#create_soy_vs_chad_meme("bigsmilesoyjak", "!marseyshooting", "I have fun new toys and games for your children", "Die").show() create_soy_vs_chad_meme("bigsmilesoyjak", "!marseyshooting", "I have fun new toys and games for your children", "Die").show()
create_webcomic([ # create_webcomic([
TwoCharacterWebcomicPanel("soyjak", "Black people deserve the rope", "marseyconfused", "Why?"), # TwoCharacterWebcomicPanel("soyjak", "Black people deserve the rope", "marseyconfused", "Why?"),
TwoCharacterWebcomicPanel("seethejak", "Because they are degenerate!!!", "marseysmug", "Kinda like you?"), # TwoCharacterWebcomicPanel("seethejak", "Because they are degenerate!!!", "marseysmug", "Kinda like you?"),
OneCharacterWebcomicPanel("soycry", "No!! I am a pure aryan white boy and I am special Hitler told me so, so fuck off you nigger cunt. God I hate you so much, if I commit suicide its gonna be your fault, fuck you"), # OneCharacterWebcomicPanel("soycry", "No!! I am a pure aryan white boy and I am special Hitler told me so, so fuck off you nigger cunt. God I hate you so much, if I commit suicide its gonna be your fault, fuck you, its not fair, why do you always have to bully me around, you are such a bitch, i hate you so much, hitler was right and six million wasnt nearly enough, the jews are responsible for this and they will be punished on the day of the rope, youll be sorry then, plus i am armed and dangerous and i have a gun and i will shoot you if you keep making fun of me plus youll be in troulbe if I kill myself so how do you like that you stupid nigger bitch. fuck", words_in_background=True),
TitleCardWebcomicPanel("One Hour Later..."), # TitleCardWebcomicPanel("One Hour Later..."),
TwoCharacterWebcomicPanel("marseytombstone", "", "!marseycry", "He had so much to live for"), # TwoCharacterWebcomicPanel("marseytombstone", "", "!marseycry", "He had so much to live for"),
OneCharacterWebcomicPanel("marseylaugh", "Just Kidding!") # OneCharacterWebcomicPanel("marseylaugh", "Just Kidding!", False)
]).show() # ]).show()