|
@@ -0,0 +1,82 @@
|
|
|
+from sys import stdin
|
|
|
+from textwrap import fill, shorten
|
|
|
+
|
|
|
+from ujson import loads
|
|
|
+from PIL import Image, ImageDraw, ImageFont
|
|
|
+from emoji import demojize
|
|
|
+
|
|
|
+COLORS = [
|
|
|
+ (0xee, 0x49, 0x28),
|
|
|
+ (0x41, 0xa9, 0x03),
|
|
|
+ (0xe0, 0x96, 0x02),
|
|
|
+ (0x0f, 0x94, 0xed),
|
|
|
+ (0x8f, 0x3b, 0xf7),
|
|
|
+ (0xfc, 0x43, 0x80),
|
|
|
+ (0x00, 0xa1, 0xc4),
|
|
|
+ (0xeb, 0x70, 0x02)
|
|
|
+]
|
|
|
+
|
|
|
+data = loads(stdin.read())
|
|
|
+
|
|
|
+output_path = data['output_path']
|
|
|
+avatar_path = data['avatar_path']
|
|
|
+username = data['username']
|
|
|
+username_color = data['username_color']
|
|
|
+text = data['text']
|
|
|
+
|
|
|
+username = shorten(username, width=15)
|
|
|
+text = fill(text, width=30)
|
|
|
+
|
|
|
+username = demojize(username)
|
|
|
+text = demojize(text)
|
|
|
+
|
|
|
+margin = 24
|
|
|
+hpadding = 18
|
|
|
+vpadding = 14
|
|
|
+avatar_padding = 12
|
|
|
+avatar_dim = 64
|
|
|
+
|
|
|
+font = ImageFont.truetype('./resources/fonts/OpenSans-Regular.ttf', 24)
|
|
|
+username_font = ImageFont.truetype('./resources/fonts/OpenSans-Bold.ttf', 22)
|
|
|
+tail = Image.open('./resources/tail.png')
|
|
|
+mask = Image.new('L', (avatar_dim * 3, avatar_dim * 3), 0)
|
|
|
+draw = ImageDraw.Draw(mask)
|
|
|
+draw.ellipse((0, 0, avatar_dim * 3, avatar_dim * 3), fill=255)
|
|
|
+mask = mask.resize((avatar_dim, avatar_dim), Image.ANTIALIAS)
|
|
|
+tail_width, tail_height = tail.size
|
|
|
+
|
|
|
+avatar_width = avatar_dim + avatar_padding
|
|
|
+avatar_height = avatar_dim
|
|
|
+
|
|
|
+avatar = Image.open(avatar_path)
|
|
|
+avatar = avatar.resize((avatar_dim, avatar_dim))
|
|
|
+avatar.putalpha(mask)
|
|
|
+
|
|
|
+username_width, username_height = username_font.getsize(username)
|
|
|
+text_width, text_height = font.getsize_multiline(text)
|
|
|
+
|
|
|
+image_width = avatar_width + text_width + username_width + margin*2 + hpadding*2
|
|
|
+image_height = text_height + username_height + margin*2 + vpadding*2
|
|
|
+
|
|
|
+message = Image.new('RGBA', (image_width, image_height))
|
|
|
+message.paste(avatar, (margin, image_height - margin - avatar_height + 2), avatar)
|
|
|
+
|
|
|
+x1 = margin + avatar_dim + avatar_padding
|
|
|
+y1 = margin
|
|
|
+x2 = x1 + text_width + username_width + hpadding*2
|
|
|
+y2 = y1 + text_height + username_height + vpadding*2
|
|
|
+
|
|
|
+draw = ImageDraw.Draw(message)
|
|
|
+draw.rounded_rectangle((x1, y1, x2, y2), fill=(43, 43, 43), radius=7)
|
|
|
+draw.text((margin + avatar_width + hpadding, margin + vpadding/2), username, font=username_font, fill=COLORS[username_color])
|
|
|
+draw.multiline_text((margin + avatar_width + hpadding, margin + username_height + vpadding), text, font=font)
|
|
|
+
|
|
|
+message.paste(tail, (margin + avatar_width - tail_width + 8, image_height - margin - tail_height + 1), tail)
|
|
|
+
|
|
|
+ratio = image_width / image_height
|
|
|
+new_width = 512 if image_width >= image_height else min(int(512 / ratio), 512)
|
|
|
+new_height = 512 if image_height >= image_width else min(int(512 / ratio), 512)
|
|
|
+
|
|
|
+message = message.resize((new_width, new_height))
|
|
|
+
|
|
|
+message.save(output_path)
|