HOME/Articles/

pil example screen dialog (snippet)

Article Outline

Python pil example 'screen dialog'

Functions in program:

  • def test():
  • def calculate_size(text):

Modules used in program:

  • import datetime, io

python screen dialog

Python pil example: screen dialog

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageOps

import datetime, io

f_s = 13

font1 = ImageFont.truetype("roboto.ttf", f_s)
font2 = ImageFont.truetype("roboto_t.ttf", f_s)

def calculate_size(text):
    textsss = text.split("\n")
    minw = 0
    maxh = 0 
    for x in textsss:
        if x == "":
            x = "1" 
        fsd = font1.getsize(x)
        if fsd[0] > minw:
            minw = fsd[0]
        maxh+=fsd[1]

    return (minw, maxh)


class Message:

    def __init__(self, avatar, time, text, name):
        self.name = name
        self.avatar = avatar
        self.time = time
        self.text = text
        self.img = None

    def calc_image(self):
        font_size1 = font1.getsize(self.name)
        font_size15 = font1.getsize("00:00  ")
        font_size2 = font1.getsize(self.text) if not self.text.find("\n") != -1 else calculate_size(self.text)

        img = Image.new('RGB', (200+32+font_size2[0]+font_size15[0], 20+18+font_size1[1]+font_size2[1]), (255, 255, 255))

        avatar = Image.open(self.avatar).resize((42,42)) if type(self.avatar) == str else self.avatar.resize((42, 42))
        ll_size = (1000, 1000)
        mask = Image.new('L', ll_size, 0)
        draw = ImageDraw.Draw(mask)
        draw.ellipse((0, 0) + ll_size, fill=255)

        mask = ImageOps.fit(mask, avatar.size, method=Image.BICUBIC, centering=(0.5, 0.5))
        avatar.putalpha(mask)

        img.paste(avatar, (f_s, f_s), avatar)
        draw = ImageDraw.Draw(img)

        draw.text((f_s+42+10,f_s), self.name, font=font1, fill=(66, 100, 139))
        draw.text((f_s+42+15+font_size1[0],f_s), self.time, font=font2, fill=(120,127,140))
        draw.text((f_s+42+10,f_s+13+6), self.text, font=font2, fill=(0,0,0))

        self.img = img

messages = [
    Message("ava.jpg", "20:38", "пхп говно", "Tanya Kruit"),
    Message("ava2.jpg", "20:38", "пхп это я", "Глеб Фараонов")
]

width = 0
height = 0

for msg in messages:
    msg.calc_image()

    if width < msg.img.size[0]:
        width = msg.img.size[0]

    height+=msg.img.size[1]

img = Image.new('RGB', (width, height), (255,255,255))
last_pos_y = 0 
for msg in messages:
    img.paste(msg.img, (0, last_pos_y))
    last_pos_y+=msg.img.size[1]-f_s+4


def test():
    img.save("test.jpg", format="JPEG")

test()