import asyncio from typing import Any, cast import cv2 import numpy as np import PIL.Image from konabot.common.path import ASSETS_PATH cao_image = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "caoimg1.png") CAO_QUAD_POINTS = np.float32(cast(Any, [ [392, 540], [577, 557], [567, 707], [381, 687], ])) def _draw_cao_display(image: PIL.Image.Image): src = np.array(image.convert("RGB")) h, w = src.shape[:2] src_points = np.float32(cast(Any, [ [0, 0], [w, 0], [w, h], [0, h] ])) dst_points = CAO_QUAD_POINTS M = cv2.getPerspectiveTransform(cast(Any, src_points), cast(Any, dst_points)) output_size = cao_image.size output_w, output_h = output_size warped = cv2.warpPerspective( src, M, (output_w, output_h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0) ) result = PIL.Image.fromarray(warped, 'RGB').convert('RGBA') result = PIL.Image.alpha_composite(result, cao_image) return result async def draw_cao_display(image: PIL.Image.Image): return await asyncio.to_thread(_draw_cao_display, image)