From e78f351e06e432a607ebadc8de3ea6d27315c088 Mon Sep 17 00:00:00 2001 From: carp <25677564+carp@users.noreply.github.com> Date: Mon, 13 Jul 2020 13:27:04 -0400 Subject: git init --- utils.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 utils.py (limited to 'utils.py') diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..55a0623 --- /dev/null +++ b/utils.py @@ -0,0 +1,125 @@ +from pathlib import Path +from PIL import ImageFont +from shapely.geometry import Polygon +import cv2 +import os.path +import random +import subprocess +import json +from colorthief import ColorThief + +def draw_with_border(x, y, message, color_fill, color_border, font, draw): + border_width = max((font.size // 25), 2) + + + for i in range(1,border_width+1): + draw.text((x,y+i), message, fill=color_border, font=font) + draw.text((x,y-i), message, fill=color_border, font=font) + draw.text((x+i,y), message, fill=color_border, font=font) + draw.text((x-i,y), message, fill=color_border, font=font) + + draw.text((x-i,y-i), message, fill=color_border, font=font) + draw.text((x-i,y+i), message, fill=color_border, font=font) + draw.text((x+i,y-i), message, fill=color_border, font=font) + draw.text((x+i,y+i), message, fill=color_border, font=font) + + draw.text((x, y), message, fill=color_fill, font=font) + + +def detect(filename): + result = subprocess.run(['conda',"activate","detection","&&","python", 'anime-face-detector/main.py ',"-i",filename,"-o","output.json"],shell=True,stdout=subprocess.DEVNULL) + with open("output.json","r") as f: + output = json.load(f) + print(output) + return [f["bbox"] for f in output[filename]] + + +def set_font(image, message, font_name="fonts/Caveat-Bold.ttf"): + # keep increasing font size until the font area is 1/5th the size of image + font_size = 10 + font = ImageFont.truetype(font_name, size=font_size) + image_area = image.size[0] * image.size[1] + font_area = font.getsize(message)[0] * font.getsize(message)[1] + while (image_area / 3) > font_area: + font_size = font_size + 5 + font = ImageFont.truetype(font_name, size=font_size) + font_area = font.getsize(message)[0] * font.getsize(message)[1] + return font + + +def messages_multiline(text, font, image): + image_size = image.size + lines = [] + if image_size[0] > image_size[1]: + # image_width is boxed width, if its too long, dont make text go all the way across + image_width = image_size[0] / random.uniform(1, 1.5) + else: + image_width = image_size[0] + if font.getsize(text)[0] <= image_width: + # if it can fit in one line, don't do anything + lines.append(text) + else: + words = text.split(" ") + i = 0 + while i < len(words): + line = "" + while ( + i < len(words) and font.getsize(line + words[i] + " ")[0] <= image_width + ): + line = line + words[i] + " " + i += 1 + if not line: + line = words[i] + i += 1 + lines.append(line.rstrip()) + return lines + + +def get_colors(file_name): + color_thief = ColorThief(file_name) + return color_thief.get_palette(color_count=2, quality=1) + + +def randomize_location(image, messages, font): + image_size = image.size + x_coordinate = 0 + y_coordinate = 0 + for message in messages: + font_area = font.getsize(message) + # get widest line + if font_area[0] > x_coordinate: + x_coordinate = font_area[0] + # get total line height + y_coordinate = y_coordinate + font_area[1] + # try to find a location for text that doesn't overflow + # randomize locations that still fit + placed = False + tries = 0 + faces = detect(image.filename) + print("faces found:",len(faces)) + while placed is False and tries < 20: + placed = True + x = random.randrange(0, image_size[0] - x_coordinate) + y = random.randrange(0, image_size[1] - y_coordinate) + for face in faces: + if is_intersected(face, (x, y, x + x_coordinate, y + y_coordinate)): + placed = False + tries = tries + 1 + print("tried:",tries) + return (x, y, len(faces)) + + +def is_intersected(face, text): + face_polygon = Polygon( + [(face[0], face[1]), (face[2], face[1]), (face[2], face[3]), (face[0], face[3])] + ) + text_polygon = Polygon( + [(text[0], text[1]), (text[2], text[1]), (text[2], text[3]), (text[0], text[3])] + ) + return face_polygon.intersects(text_polygon) + + +def get_quote(p): + with open(p, "r", encoding="utf-8") as f: + lines = f.read().splitlines() + return random.choice(lines) -- cgit v1.2.3