You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MoviePy:如何实现图片在视频中的多阶段移动效果?

实现水印两阶段移动效果的修改方案

要实现水印先向右弹出、再向左滑走的效果,你需要修改set_position的时间回调函数,根据不同时间区间定义不同的移动逻辑。以下是具体修改步骤:

1. 获取水印尺寸(用于精准计算位置)

在创建ImageClip后,先获取水印的宽度,这样能准确控制它从屏幕外弹出的初始位置:

image = ImageClip('watermark.png', duration=10)
watermark_width = image.size[0]  # 获取水印图片的宽度

2. 定义移动阶段的时间参数

根据需求自定义各阶段的时长(可根据实际效果调整):

pop_duration = 1  # 向右弹出的时长(秒)
hold_duration = 2  # 弹出后停留的时长(秒)
start_slide_time = pop_duration + hold_duration  # 开始向左滑走的时间点
target_x = 20  # 水印停留时的x坐标(可调整)

3. 替换位置回调函数

把原来的set_position逻辑替换成分阶段的移动逻辑:

image = image.set_position(lambda t: (
    # 阶段1:向右弹出(从屏幕外左侧滑到目标位置)
    np.interp(t, [0, pop_duration], [-watermark_width, target_x])
    if t <= pop_duration
    # 阶段2:停留不动
    else target_x
    if t <= start_slide_time
    # 阶段3:向左滑走(基于你原有的指数平滑逻辑,调整为从目标位置开始滑出)
    else target_x - np.exp(10*(t - start_slide_time)) * (target_x + watermark_width),
    75  # y坐标保持不变
))

完整修改后的代码片段

替换你原代码中从image = ImageClip(...)开始的部分:

image = ImageClip('watermark.png', duration=10)
watermark_width = image.size[0]
image.fps = 60

# 定义移动阶段参数
pop_duration = 1
hold_duration = 2
start_slide_time = pop_duration + hold_duration
target_x = 20

# 设置分阶段移动的位置回调
image = image.set_position(lambda t: (
    np.interp(t, [0, pop_duration], [-watermark_width, target_x])
    if t <= pop_duration
    else target_x
    if t <= start_slide_time
    else target_x - np.exp(10*(t - start_slide_time)) * (target_x + watermark_width),
    75
))

finalList.append(image)

参数说明与调整建议

  • pop_duration:控制弹出速度,值越小弹出越快
  • hold_duration:控制水印停留的时长,按需调整
  • target_x:水印最终停留的x坐标,可根据布局需求修改
  • 阶段3的np.exp(10*(t - start_slide_time))中的10控制滑走的速度,值越大滑走越快,可按需调整

内容的提问来源于stack exchange,提问作者neari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:40:24