From 35f411fb3adf6fbe222f436110f145e10191a7f0 Mon Sep 17 00:00:00 2001 From: MixBadGun <1059129006@qq.com> Date: Thu, 4 Dec 2025 16:20:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E9=86=92UI=E7=9A=84GIF=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=8E=E5=8F=82=E6=95=B0=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/notice_ui/notice.py | 40 ++++++++++++----------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/konabot/plugins/notice_ui/notice.py b/konabot/plugins/notice_ui/notice.py index 8a5e7c0..a50bc5d 100644 --- a/konabot/plugins/notice_ui/notice.py +++ b/konabot/plugins/notice_ui/notice.py @@ -1,8 +1,11 @@ from io import BytesIO +import random from PIL import Image from konabot.common.web_render import konaweb from konabot.common.web_render.core import WebRenderer +import numpy as np + from playwright.async_api import Page class NoticeUI: @@ -18,13 +21,19 @@ class NoticeUI: # 直到 setContent 函数加载完成 await page.wait_for_function("typeof setContent === 'function'", timeout=1000) # 设置标题和消息内容 - await page.evaluate(f'setContent("{title}", "{message}")') + await page.evaluate("""([title, message]) => { + return setContent(title, message); + }""", + [title, message]) async def mask_function(page: Page): # 直到 setContent 函数加载完成 await page.wait_for_function("typeof setContent === 'function'", timeout=1000) # 设置标题和消息内容 - await page.evaluate(f'setContent("{title}", "{message}")') + await page.evaluate("""([title, message]) => { + return setContent(title, message); + }""", + [title, message]) # 直到 setMaskMode 函数加载完成 await page.wait_for_function("typeof setMaskMode === 'function'", timeout=1000) await page.evaluate('setMaskMode(true)') @@ -44,33 +53,16 @@ class NoticeUI: image = Image.open(BytesIO(image_bytes)).convert("RGBA") mask = Image.open(BytesIO(mask_bytes)).convert("L") - - # 使用mask作为alpha通道 - r, g, b, _ = image.split() - transparent_image = Image.merge("RGBA", (r, g, b, mask)) - - # 先创建一个纯白色背景,然后粘贴透明图像 - background = Image.new("RGBA", transparent_image.size, (255, 255, 255, 255)) - composite = Image.alpha_composite(background, transparent_image) - - palette_img = composite.convert("RGB").convert( - "P", - palette=Image.Palette.WEB, - colors=256, - dither=Image.Dither.NONE - ) - - # 将alpha值小于128的设为透明 - alpha_mask = mask.point(lambda x: 0 if x < 128 else 255) + # 遮罩抖动二值化 + mask = mask.convert('1') # 先转换为1位图像 + image.putalpha(mask) # 保存为GIF output_buffer = BytesIO() - palette_img.save( + image.save( output_buffer, format="GIF", - transparency=0, # 将索引0设为透明 - disposal=2, - loop=0 + disposal=2 ) output_buffer.seek(0)