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

GIF缩放程序首次循环后thumbnail函数报错求助

解决GIF缩放时thumbnail触发ValueError: box can't exceed original image size的问题

你的问题出在直接修改了GIF的原Image对象:当调用im.seek(i)切换到某一帧后,直接对im执行thumbnail会改变该对象的尺寸属性。后续seek到下一帧时,PIL内部仍会基于被修改后的尺寸处理原始帧数据,最终导致resize操作触发box超出原图像尺寸的错误。

修正后的代码

from PIL import Image
from icecream import ic

def process_gif(in_path, out_path= 'out.gif', size= (32,32)):
    with Image.open(in_path) as im :
        images = []
        durations = []
        for i in range(im.n_frames) :
            im.seek(i)
            ic(im.size)
            # 复制当前帧的独立副本,避免修改原Image对象
            frame = im.copy()
            frame.thumbnail(size, Image.Resampling.LANCZOS) # noqa
            ic(frame.size)
            # 接收convert的返回值,因为convert不会修改原对象
            frame = frame.convert('RGBA')
            im_temp = Image.new('RGBA', frame.size, (0, 0, 0, 0))
            im_temp.paste(frame, (0, 0))
            images.append(im_temp)
            ic(im_temp.size)
            durations.append(im.info['duration'])
        images[0].save(
            out_path,
            interlace=True,
            save_all=True,
            append_images=images[1 :],
            loop=0,
            duration=durations,
            disposal=2,
            background=255,
            optimize=False
        )

关键修改说明

  • 复制帧副本:通过im.copy()创建当前帧的独立副本,所有缩放、格式转换操作都在副本上进行,不会影响原im对象的状态,确保后续帧切换时保持原始属性。
  • 接收convert返回值:Image.convert()方法不会修改原对象,必须将返回的新图像对象赋值给变量,否则格式转换操作不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:18