241 lines
6.3 KiB
Python
241 lines
6.3 KiB
Python
import asyncio
|
|
from typing import Any, cast
|
|
|
|
import imagetext_py
|
|
import PIL.Image
|
|
|
|
from konabot.common.path import ASSETS_PATH
|
|
from konabot.common.utils.to_async import make_async
|
|
|
|
from .base.fonts import (
|
|
HARMONYOS_SANS_SC_BLACK,
|
|
HARMONYOS_SANS_SC_REGULAR,
|
|
LXGWWENKAI_REGULAR,
|
|
)
|
|
|
|
geimao_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "geimao.jpg").convert(
|
|
"RGBA"
|
|
)
|
|
pt_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "ptsay.png").convert("RGBA")
|
|
mnk_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "mnksay.jpg").convert("RGBA")
|
|
dasuan_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "dss.png").convert("RGBA")
|
|
suan_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "suanleba.png").convert(
|
|
"RGBA"
|
|
)
|
|
cute_ten_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "tententen.png").convert(
|
|
"RGBA"
|
|
)
|
|
kio_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "kiosay.jpg").convert("RGBA")
|
|
vr_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "vr.jpg").convert("RGBA")
|
|
xm_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "xiaomu.png").convert("RGBA")
|
|
|
|
|
|
def _draw_geimao(saying: str):
|
|
img = geimao_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
960,
|
|
50,
|
|
0.5,
|
|
0,
|
|
1920,
|
|
240,
|
|
HARMONYOS_SANS_SC_BLACK,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
0.8,
|
|
imagetext_py.TextAlign.Center,
|
|
cast(Any, 30.0),
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("FFFFFFFF")),
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
async def draw_geimao(saying: str):
|
|
return await asyncio.to_thread(_draw_geimao, saying)
|
|
|
|
|
|
def _draw_pt(saying: str):
|
|
img = pt_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
259,
|
|
278,
|
|
0.5,
|
|
0.5,
|
|
360,
|
|
48,
|
|
HARMONYOS_SANS_SC_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
async def draw_pt(saying: str):
|
|
return await asyncio.to_thread(_draw_pt, saying)
|
|
|
|
|
|
def _draw_mnk(saying: str):
|
|
img = mnk_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
540,
|
|
25,
|
|
0.5,
|
|
0,
|
|
1080,
|
|
120,
|
|
HARMONYOS_SANS_SC_BLACK,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
0.8,
|
|
imagetext_py.TextAlign.Center,
|
|
cast(Any, 15.0),
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("FFFFFFFF")),
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
async def draw_mnk(saying: str):
|
|
return await asyncio.to_thread(_draw_mnk, saying)
|
|
|
|
|
|
def _draw_suan(saying: str, dasuan: bool = False):
|
|
if dasuan:
|
|
img = dasuan_image.copy()
|
|
else:
|
|
img = suan_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
1020,
|
|
290,
|
|
0.5,
|
|
0.5,
|
|
400,
|
|
48,
|
|
LXGWWENKAI_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
async def draw_suan(saying: str, dasuan: bool = False):
|
|
return await asyncio.to_thread(_draw_suan, saying, dasuan)
|
|
|
|
|
|
def _draw_cute_ten(saying: str):
|
|
img = cute_ten_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
390,
|
|
479,
|
|
0.5,
|
|
0.5,
|
|
760,
|
|
96,
|
|
LXGWWENKAI_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
async def draw_cute_ten(saying: str):
|
|
return await asyncio.to_thread(_draw_cute_ten, saying)
|
|
|
|
|
|
@make_async
|
|
def draw_kiosay(saying: str):
|
|
img = kio_image.copy()
|
|
with imagetext_py.Writer(img) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
450,
|
|
540,
|
|
0.5,
|
|
0.5,
|
|
900,
|
|
96,
|
|
LXGWWENKAI_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
return img
|
|
|
|
|
|
@make_async
|
|
def draw_vr(saying: str):
|
|
img = vr_image.copy()
|
|
w, h = img.size
|
|
hw = 300
|
|
|
|
img2 = PIL.Image.new("RGBA", (w, h + hw), "white")
|
|
img2.paste(img, (0, hw))
|
|
|
|
with imagetext_py.Writer(img2) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
w // 2,
|
|
hw // 2 + 15,
|
|
0.5,
|
|
0.5,
|
|
w,
|
|
64,
|
|
LXGWWENKAI_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
|
|
return img2
|
|
|
|
|
|
@make_async
|
|
def draw_xm(saying: str, image: PIL.Image.Image | None = None):
|
|
img_base = PIL.Image.new("RGBA", xm_image.size, (255, 255, 255, 255))
|
|
with imagetext_py.Writer(img_base) as iw:
|
|
iw.draw_text_wrapped(
|
|
saying,
|
|
442,
|
|
200,
|
|
0.5,
|
|
0.5,
|
|
884,
|
|
64,
|
|
LXGWWENKAI_REGULAR,
|
|
imagetext_py.Paint.Color(imagetext_py.Color.from_hex("000000FF")),
|
|
1.0,
|
|
imagetext_py.TextAlign.Center,
|
|
draw_emojis=True,
|
|
)
|
|
if image is not None:
|
|
image_r = image.copy().convert("RGBA")
|
|
|
|
width, height = image_r.size
|
|
base_width = img_base.size[0]
|
|
height = int(height / width * base_width)
|
|
image_r = image_r.resize((base_width, height))
|
|
|
|
# try to align center
|
|
y = 215 - image_r.height // 2
|
|
img_base.paste(image_r, (0, y), mask=image_r)
|
|
img_base.paste(xm_image, (0, 0), mask=xm_image)
|
|
return img_base
|
|
|