添加安安展示
This commit is contained in:
@ -27,6 +27,15 @@ SNAUR_QUAD_POINTS = np.float32(cast(Any, [
|
||||
[106, 1280],
|
||||
]))
|
||||
|
||||
anan_image_base = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "anan_base.png")
|
||||
anan_image_top = PIL.Image.open(ASSETS_PATH / "img" / "meme" / "anan_top.png")
|
||||
ANAN_QUAD_POINTS = np.float32(cast(Any, [
|
||||
[150, 250],
|
||||
[650, 250],
|
||||
[630, 750],
|
||||
[170, 750],
|
||||
]))
|
||||
|
||||
def _draw_cao_display(image: PIL.Image.Image):
|
||||
src = np.array(image.convert("RGB"))
|
||||
h, w = src.shape[:2]
|
||||
@ -139,3 +148,50 @@ async def draw_snaur_display(
|
||||
opacity, saturation,
|
||||
)
|
||||
|
||||
|
||||
def _draw_anan_display(image: PIL.Image.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 = ANAN_QUAD_POINTS
|
||||
M = cv2.getPerspectiveTransform(cast(Any, src_points), cast(Any, dst_points))
|
||||
output_w, output_h = anan_image_top.size
|
||||
src_rgb = cv2.cvtColor(src, cv2.COLOR_RGBA2RGB) if src.shape[2] == 4 else src
|
||||
warped_rgb = cv2.warpPerspective(
|
||||
src_rgb,
|
||||
M,
|
||||
(output_w, output_h),
|
||||
flags=cv2.INTER_LINEAR,
|
||||
borderMode=cv2.BORDER_CONSTANT,
|
||||
borderValue=(0, 0, 0)
|
||||
)
|
||||
|
||||
mask = np.zeros((h, w), dtype=np.uint8)
|
||||
mask[:, :] = 255
|
||||
warped_mask = cv2.warpPerspective(
|
||||
mask,
|
||||
M,
|
||||
(output_w, output_h),
|
||||
flags=cv2.INTER_LINEAR,
|
||||
borderMode=cv2.BORDER_CONSTANT,
|
||||
borderValue=0
|
||||
)
|
||||
|
||||
warped_rgba = cv2.cvtColor(warped_rgb, cv2.COLOR_RGB2RGBA)
|
||||
warped_rgba[:, :, 3] = warped_mask
|
||||
|
||||
warped_pil = PIL.Image.fromarray(warped_rgba, 'RGBA')
|
||||
|
||||
result = PIL.Image.alpha_composite(anan_image_base, warped_pil)
|
||||
result = PIL.Image.alpha_composite(result, anan_image_top)
|
||||
return result
|
||||
|
||||
|
||||
async def draw_anan_display(image: PIL.Image.Image) -> PIL.Image.Image:
|
||||
return await asyncio.to_thread(_draw_anan_display, image)
|
||||
Reference in New Issue
Block a user