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

如何用Pillow和imageio在Python中正确创建指定帧的循环GIF?

如何用Pillow和imageio在Python中正确创建指定帧的循环GIF?

嘿,我来帮你解决这个问题!你遇到的情况其实是Pillow在保存GIF时的默认优化机制搞的鬼——它会自动合并重复的帧,所以你明明做了60帧,最后却只剩两帧了。下面我给你两种解决方案,一种是调整Pillow的保存参数,另一种是用imageio库来实现,都能完美搞定你的需求。

方法一:调整Pillow参数解决

首先要明确几个关键参数的作用,然后修改你的代码:

  • save_all=True:必须设置这个,不然Pillow只会保存第一帧
  • optimize=False:关闭默认的帧优化,避免重复的黑色帧被自动合并
  • duration=100:每帧停留0.1秒,注意这里单位是毫秒
  • loop=0:设置为0表示无限循环

完整代码示例:

from PIL import Image

# 定义画布尺寸,你可以根据需求调整
size = (100, 100)
frames = []

# 生成前4帧:带红色方块的画面
for _ in range(4):
    # 创建黑色背景的图像
    img = Image.new("RGB", size, color="black")
    # 在中心绘制50x50的红色方块(坐标范围25到74)
    for x in range(25, 75):
        for y in range(25, 75):
            img.putpixel((x, y), (255, 0, 0))
    frames.append(img)

# 生成剩下的56帧:纯黑色画面
for _ in range(56):
    img = Image.new("RGB", size, color="black")
    frames.append(img)

# 保存GIF
frames[0].save(
    "animated_pillow.gif",
    save_all=True,
    append_images=frames[1:],
    duration=100,
    loop=0,
    optimize=False
)

方法二:用imageio库更直观实现

如果你觉得Pillow的参数有点绕,也可以用imageio库来做,它处理GIF的逻辑更直接,默认不会合并重复帧。

首先先安装imageio:

pip install imageio

然后是代码示例:

import imageio
import numpy as np

size = (100, 100)
frames = []

# 前4帧:红色方块
for _ in range(4):
    # 创建黑色背景的numpy数组(imageio支持numpy数组作为帧)
    img = np.zeros((size[1], size[0], 3), dtype=np.uint8)
    # 绘制红色方块,切片操作比putpixel更高效
    img[25:75, 25:75] = [255, 0, 0]
    frames.append(img)

# 剩下的56帧:纯黑色
for _ in range(56):
    img = np.zeros((size[1], size[0], 3), dtype=np.uint8)
    frames.append(img)

# 保存GIF,duration直接用秒数,很直观
imageio.mimsave(
    "animated_imageio.gif",
    frames,
    duration=0.1,
    loop=0
)

两种方法都能实现你要的效果:前4帧显示红色方块,之后56帧显示纯黑色,整个GIF无限循环,每帧停留0.1秒。你可以根据自己的习惯选择其中一种来用~

备注:内容来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 15:58:10