From 81aac106654931ddca762fec941acadd4b887f12 Mon Sep 17 00:00:00 2001 From: passthem Date: Thu, 16 Oct 2025 23:27:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E6=A1=A3=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/docs/user/卵总展示.txt | 20 +++++++++++ konabot/plugins/memepack/__init__.py | 13 +++++-- konabot/plugins/memepack/drawing/display.py | 39 +++++++++++++++------ 3 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 konabot/docs/user/卵总展示.txt diff --git a/konabot/docs/user/卵总展示.txt b/konabot/docs/user/卵总展示.txt new file mode 100644 index 0000000..c51fde6 --- /dev/null +++ b/konabot/docs/user/卵总展示.txt @@ -0,0 +1,20 @@ +指令介绍 + 卵总展示 - 让卵总举起你的图片 + +格式 + <引用图片> 卵总展示 [选项] + 卵总展示 [选项] <图片> + +选项 + `--whiteness ` 白度 + 将原图进行指数变换,以调整它的白的程度,默认为 0.0 + + `--black-level ` 黑色等级 + 将原图减淡,数值越大越淡,范围 0.0-1.0,默认 0.2 + + `--opacity ` 不透明度 + 将你的图片叠放在图片上的不透明度,默认为 0.8 + + `--saturation ` 饱和度 + 调整原图的饱和度,应该要大于 0.0,默认为 0.85 + diff --git a/konabot/plugins/memepack/__init__.py b/konabot/plugins/memepack/__init__.py index ea3acf6..7c57902 100644 --- a/konabot/plugins/memepack/__init__.py +++ b/konabot/plugins/memepack/__init__.py @@ -2,7 +2,7 @@ from io import BytesIO from typing import Iterable, cast from nonebot import on_message -from nonebot_plugin_alconna import (Alconna, Args, Field, Image, MultiVar, Text, +from nonebot_plugin_alconna import (Alconna, Args, Field, Image, MultiVar, Option, Text, UniMessage, UniMsg, on_alconna) from konabot.common.nb.extract_image import PIL_Image, extract_image_from_message @@ -143,12 +143,19 @@ async def _(msg: UniMsg, evt: Event, bot: Bot): snaur_display_cmd = on_alconna(Alconna( "卵总展示", + Option("--whiteness", Args["whiteness", float], alias=["-w"]), + Option("--black-level", Args["black_level", float], alias=["-b"]), + Option("--opacity", Args["opacity", float], alias=["-o"]), + Option("--saturation", Args["saturation", float], alias=["-s"]), Args["image", Image | None], )) @snaur_display_cmd.handle() -async def _(img: PIL_Image): - img_processed = await draw_snaur_display(img) +async def _(img: PIL_Image, whiteness: float = 0.0, black_level: float = 0.2, + opacity: float = 0.8, saturation: float = 0.85): + img_processed = await draw_snaur_display( + img, whiteness, black_level, opacity, saturation, + ) img_data = BytesIO() img_processed.save(img_data, "PNG") await snaur_display_cmd.send(await UniMessage().image(raw=img_data).export()) diff --git a/konabot/plugins/memepack/drawing/display.py b/konabot/plugins/memepack/drawing/display.py index e757e3e..21825ea 100644 --- a/konabot/plugins/memepack/drawing/display.py +++ b/konabot/plugins/memepack/drawing/display.py @@ -57,8 +57,14 @@ async def draw_cao_display(image: PIL.Image.Image): return await asyncio.to_thread(_draw_cao_display, image) -def _draw_snaur_display(image: PIL.Image.Image): - src = np.array(image.convert("RGB")) +def _draw_snaur_display( + image : PIL.Image.Image, + whiteness : float = 0.0 , + black_level: float = 0.2 , + opacity : float = 0.8 , + saturation : float = 0.85 , +): + src = np.array(image.convert("RGBA")) _h, _w = src.shape[:2] if _w / _h < SNAUR_RATIO: @@ -98,25 +104,38 @@ def _draw_snaur_display(image: PIL.Image.Image): borderValue=(0, 0, 0) ) - result = PIL.Image.fromarray(warped, 'RGB').convert('RGBA') - result = PIL.ImageChops.multiply(result, snaur_image_base) + result = PIL.Image.fromarray(warped, 'RGBA') r, g, b, a = result.split() - a = a.point(lambda p: int(p * 0.8)) - f2 = lambda p: int(p * 0.8 + 0.2) + a = a.point(lambda p: int(p * opacity)) + f2 = lambda p: int( + ((p / 255) ** (2 ** whiteness)) * 255 * (1 - black_level) + + 255 * black_level + ) r = r.point(f2) g = g.point(f2) b = b.point(f2) result = PIL.Image.merge('RGBA', (r, g, b, a)) - result = PIL.Image.alpha_composite(snaur_image_base, result) enhancer = PIL.ImageEnhance.Color(result) - result = enhancer.enhance(0.85) + result = enhancer.enhance(saturation) + result = PIL.ImageChops.multiply(result, snaur_image_base) + + result = PIL.Image.alpha_composite(snaur_image_base, result) result = PIL.Image.alpha_composite(result, snaur_image_top) return result -async def draw_snaur_display(image: PIL.Image.Image) -> PIL.Image.Image: - return await asyncio.to_thread(_draw_snaur_display, image) +async def draw_snaur_display( + image : PIL.Image.Image, + whiteness : float = 0.0 , + black_level: float = 0.2 , + opacity : float = 0.8 , + saturation : float = 0.85 , +) -> PIL.Image.Image: + return await asyncio.to_thread( + _draw_snaur_display, image, whiteness, black_level, + opacity, saturation, + )