空调指数概率损坏与空调、骰子gif图的背景优化

This commit is contained in:
2025-10-26 01:06:26 +08:00
parent 16351792b6
commit 7a20c3fe2f
3 changed files with 26 additions and 14 deletions

View File

@ -9,6 +9,9 @@ from konabot.common.longtask import DepLongTaskTarget
from konabot.common.path import ASSETS_PATH
from konabot.plugins.air_conditioner.ac import AirConditioner, generate_ac_image
import random
import math
def get_ac(id: str) -> AirConditioner:
ac = AirConditioner.air_conditioners.get(id)
if ac is None:
@ -82,14 +85,17 @@ async def _(event: BaseEvent, target: DepLongTaskTarget):
return
ac.temperature += 1
if ac.temperature > 40:
# 打开爆炸图片
with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f:
output = BytesIO()
Image.open(f).save(output, format="GIF")
await evt.send(await UniMessage().image(raw=output).export())
ac.burnt = True
await evt.send("太热啦,空调炸了!")
return
# 根据温度随机出是否爆炸40度开始呈指数增长
possibility = -math.e ** ((40-ac.temperature) / 50) + 1
if random.random() < possibility:
# 打开爆炸图片
with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f:
output = BytesIO()
Image.open(f).save(output, format="GIF")
await evt.send(await UniMessage().image(raw=output).export())
ac.burnt = True
await evt.send("太热啦,空调炸了!")
return
await send_ac_image(evt, ac)
evt = on_alconna(Alconna(
@ -105,7 +111,10 @@ async def _(event: BaseEvent, target: DepLongTaskTarget):
return
ac.temperature -= 1
if ac.temperature < 0:
ac.frozen = True
# 根据温度随机出是否冻结0度开始呈指数增长
possibility = -math.e ** (ac.temperature / 50) + 1
if random.random() < possibility:
ac.frozen = True
await send_ac_image(evt, ac)
evt = on_alconna(Alconna(

View File

@ -168,13 +168,13 @@ def precise_blend_with_perspective(background, foreground, corners):
return result
def wiggle_transform(image) -> list[np.ndarray]:
def wiggle_transform(image, intensity=2) -> list[np.ndarray]:
'''
返回一组图像振动的帧组,模拟空调运作时的抖动效果
'''
frames = []
height, width = image.shape[:2]
shifts = [(-2, 0), (2, 0), (0, -2), (0, 2), (0, 0)]
shifts = [(-intensity, 0), (intensity, 0), (0, -intensity), (0, intensity), (0, 0)]
for dx, dy in shifts:
M = np.float32([[1, 0, dx], [0, 1, dy]])
shifted = cv2.warpAffine(image, M, (width, height))
@ -218,8 +218,10 @@ async def generate_ac_image(ac: AirConditioner) -> BytesIO:
final_image_simple = blend_with_transparency(ac_image, transformed_text, (0, 0))
frames = wiggle_transform(final_image_simple)
intensity = max(2, abs(ac.temperature - 24) // 2)
frames = wiggle_transform(final_image_simple, intensity=intensity)
pil_frames = [Image.fromarray(frame) for frame in frames]
output = BytesIO()
pil_frames[0].save(output, format="GIF", save_all=True, append_images=pil_frames[1:], loop=0, duration=50)
pil_frames[0].save(output, format="GIF", save_all=True, append_images=pil_frames[1:], loop=0, duration=50, disposal=2)
return output

View File

@ -394,7 +394,8 @@ async def generate_dice_image(number: str) -> BytesIO:
append_images=images[1:],
duration=frame_durations,
format='GIF',
loop=1)
loop=1,
disposal=2)
output.seek(0)
# pil_final.save(output, format='PNG')
return output