空调指数概率损坏与空调、骰子gif图的背景优化
This commit is contained in:
@ -9,6 +9,9 @@ from konabot.common.longtask import DepLongTaskTarget
|
|||||||
from konabot.common.path import ASSETS_PATH
|
from konabot.common.path import ASSETS_PATH
|
||||||
from konabot.plugins.air_conditioner.ac import AirConditioner, generate_ac_image
|
from konabot.plugins.air_conditioner.ac import AirConditioner, generate_ac_image
|
||||||
|
|
||||||
|
import random
|
||||||
|
import math
|
||||||
|
|
||||||
def get_ac(id: str) -> AirConditioner:
|
def get_ac(id: str) -> AirConditioner:
|
||||||
ac = AirConditioner.air_conditioners.get(id)
|
ac = AirConditioner.air_conditioners.get(id)
|
||||||
if ac is None:
|
if ac is None:
|
||||||
@ -82,14 +85,17 @@ async def _(event: BaseEvent, target: DepLongTaskTarget):
|
|||||||
return
|
return
|
||||||
ac.temperature += 1
|
ac.temperature += 1
|
||||||
if ac.temperature > 40:
|
if ac.temperature > 40:
|
||||||
# 打开爆炸图片
|
# 根据温度随机出是否爆炸,40度开始,呈指数增长
|
||||||
with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f:
|
possibility = -math.e ** ((40-ac.temperature) / 50) + 1
|
||||||
output = BytesIO()
|
if random.random() < possibility:
|
||||||
Image.open(f).save(output, format="GIF")
|
# 打开爆炸图片
|
||||||
await evt.send(await UniMessage().image(raw=output).export())
|
with open(ASSETS_PATH / "img" / "other" / "boom.jpg", "rb") as f:
|
||||||
ac.burnt = True
|
output = BytesIO()
|
||||||
await evt.send("太热啦,空调炸了!")
|
Image.open(f).save(output, format="GIF")
|
||||||
return
|
await evt.send(await UniMessage().image(raw=output).export())
|
||||||
|
ac.burnt = True
|
||||||
|
await evt.send("太热啦,空调炸了!")
|
||||||
|
return
|
||||||
await send_ac_image(evt, ac)
|
await send_ac_image(evt, ac)
|
||||||
|
|
||||||
evt = on_alconna(Alconna(
|
evt = on_alconna(Alconna(
|
||||||
@ -105,7 +111,10 @@ async def _(event: BaseEvent, target: DepLongTaskTarget):
|
|||||||
return
|
return
|
||||||
ac.temperature -= 1
|
ac.temperature -= 1
|
||||||
if ac.temperature < 0:
|
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)
|
await send_ac_image(evt, ac)
|
||||||
|
|
||||||
evt = on_alconna(Alconna(
|
evt = on_alconna(Alconna(
|
||||||
|
|||||||
@ -168,13 +168,13 @@ def precise_blend_with_perspective(background, foreground, corners):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def wiggle_transform(image) -> list[np.ndarray]:
|
def wiggle_transform(image, intensity=2) -> list[np.ndarray]:
|
||||||
'''
|
'''
|
||||||
返回一组图像振动的帧组,模拟空调运作时的抖动效果
|
返回一组图像振动的帧组,模拟空调运作时的抖动效果
|
||||||
'''
|
'''
|
||||||
frames = []
|
frames = []
|
||||||
height, width = image.shape[:2]
|
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:
|
for dx, dy in shifts:
|
||||||
M = np.float32([[1, 0, dx], [0, 1, dy]])
|
M = np.float32([[1, 0, dx], [0, 1, dy]])
|
||||||
shifted = cv2.warpAffine(image, M, (width, height))
|
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))
|
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]
|
pil_frames = [Image.fromarray(frame) for frame in frames]
|
||||||
output = BytesIO()
|
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
|
return output
|
||||||
@ -394,7 +394,8 @@ async def generate_dice_image(number: str) -> BytesIO:
|
|||||||
append_images=images[1:],
|
append_images=images[1:],
|
||||||
duration=frame_durations,
|
duration=frame_durations,
|
||||||
format='GIF',
|
format='GIF',
|
||||||
loop=1)
|
loop=1,
|
||||||
|
disposal=2)
|
||||||
output.seek(0)
|
output.seek(0)
|
||||||
# pil_final.save(output, format='PNG')
|
# pil_final.save(output, format='PNG')
|
||||||
return output
|
return output
|
||||||
Reference in New Issue
Block a user