如何用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
相关产品推荐
相关产品推荐

