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

