添加 giftool
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
2025-10-12 12:47:52 +08:00
parent d096f43d38
commit 0ca901e7b1
2 changed files with 69 additions and 1 deletions

View File

@ -36,6 +36,7 @@ cmd_giftool = on_alconna(Alconna(
Option("--frames:v", Args["frame_count", int]),
Option("-t", Args["length", str]),
Option("-to", Args["end_point", str]),
Option("--speed", Args["speed_factor", float], default=1.0, alias=["-s"]),
))
@ -45,6 +46,7 @@ async def _(
start_point: str | None = None,
frame_count: int | None = None,
length: str | None = None,
speed_factor: float = 1.0,
end_point: str | None = None,
):
ss: None | float = None
@ -69,9 +71,12 @@ async def _(
raise BotExceptionMessage("错误:出点时间小于入点")
if frame_count is not None and frame_count <= 0:
raise BotExceptionMessage("错误:帧数量应该大于 0")
if speed_factor <= 0:
raise BotExceptionMessage("错误:--speed 必须大于 0")
if not getattr(image, "is_animated", False):
raise BotExceptionMessage("错误输入的不是动图GIF")
frames = []
durations = []
total_duration = 0.0
@ -135,13 +140,17 @@ async def _(
output_img = BytesIO()
adjusted_durations = [
max(10, int(dur / speed_factor)) for dur in selected_durations
]
if selected_frames:
selected_frames[0].save(
output_img,
format="GIF",
save_all=True,
append_images=selected_frames[1:],
duration=selected_durations,
duration=adjusted_durations,
loop=0,
)
else: