Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 81aac10665 | |||
| 3ce230adfe |
20
konabot/docs/user/卵总展示.txt
Normal file
20
konabot/docs/user/卵总展示.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
指令介绍
|
||||||
|
卵总展示 - 让卵总举起你的图片
|
||||||
|
|
||||||
|
格式
|
||||||
|
<引用图片> 卵总展示 [选项]
|
||||||
|
卵总展示 [选项] <图片>
|
||||||
|
|
||||||
|
选项
|
||||||
|
`--whiteness <number>` 白度
|
||||||
|
将原图进行指数变换,以调整它的白的程度,默认为 0.0
|
||||||
|
|
||||||
|
`--black-level <number>` 黑色等级
|
||||||
|
将原图减淡,数值越大越淡,范围 0.0-1.0,默认 0.2
|
||||||
|
|
||||||
|
`--opacity <number>` 不透明度
|
||||||
|
将你的图片叠放在图片上的不透明度,默认为 0.8
|
||||||
|
|
||||||
|
`--saturation <number>` 饱和度
|
||||||
|
调整原图的饱和度,应该要大于 0.0,默认为 0.85
|
||||||
|
|
||||||
@ -2,7 +2,7 @@ from io import BytesIO
|
|||||||
from typing import Iterable, cast
|
from typing import Iterable, cast
|
||||||
|
|
||||||
from nonebot import on_message
|
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)
|
UniMessage, UniMsg, on_alconna)
|
||||||
|
|
||||||
from konabot.common.nb.extract_image import PIL_Image, extract_image_from_message
|
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(
|
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],
|
Args["image", Image | None],
|
||||||
))
|
))
|
||||||
|
|
||||||
@snaur_display_cmd.handle()
|
@snaur_display_cmd.handle()
|
||||||
async def _(img: PIL_Image):
|
async def _(img: PIL_Image, whiteness: float = 0.0, black_level: float = 0.2,
|
||||||
img_processed = await draw_snaur_display(img)
|
opacity: float = 0.8, saturation: float = 0.85):
|
||||||
|
img_processed = await draw_snaur_display(
|
||||||
|
img, whiteness, black_level, opacity, saturation,
|
||||||
|
)
|
||||||
img_data = BytesIO()
|
img_data = BytesIO()
|
||||||
img_processed.save(img_data, "PNG")
|
img_processed.save(img_data, "PNG")
|
||||||
await snaur_display_cmd.send(await UniMessage().image(raw=img_data).export())
|
await snaur_display_cmd.send(await UniMessage().image(raw=img_data).export())
|
||||||
|
|||||||
@ -57,8 +57,14 @@ async def draw_cao_display(image: PIL.Image.Image):
|
|||||||
return await asyncio.to_thread(_draw_cao_display, image)
|
return await asyncio.to_thread(_draw_cao_display, image)
|
||||||
|
|
||||||
|
|
||||||
def _draw_snaur_display(image: PIL.Image.Image):
|
def _draw_snaur_display(
|
||||||
src = np.array(image.convert("RGB"))
|
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]
|
_h, _w = src.shape[:2]
|
||||||
|
|
||||||
if _w / _h < SNAUR_RATIO:
|
if _w / _h < SNAUR_RATIO:
|
||||||
@ -98,20 +104,38 @@ def _draw_snaur_display(image: PIL.Image.Image):
|
|||||||
borderValue=(0, 0, 0)
|
borderValue=(0, 0, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
result = PIL.Image.fromarray(warped, 'RGB').convert('RGBA')
|
result = PIL.Image.fromarray(warped, 'RGBA')
|
||||||
result = PIL.ImageChops.multiply(result, snaur_image_base)
|
|
||||||
|
|
||||||
r, g, b, a = result.split()
|
r, g, b, a = result.split()
|
||||||
a = a.point(lambda p: int(p * 0.8))
|
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.merge('RGBA', (r, g, b, a))
|
||||||
|
|
||||||
enhancer = PIL.ImageEnhance.Color(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)
|
result = PIL.Image.alpha_composite(result, snaur_image_top)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
async def draw_snaur_display(image: PIL.Image.Image) -> PIL.Image.Image:
|
async def draw_snaur_display(
|
||||||
return await asyncio.to_thread(_draw_snaur_display, image)
|
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,
|
||||||
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user