我有一个gif
图像,希望用pillow
调整大小以减小它的尺寸。当前gif
的大小为2MB。
我正在尝试:
调整大小使其高度/宽度更小
降低其质量
使用JPEG格式,通常以下代码片段就足够让大图片的大小大幅减小。
from PIL import Image
im = Image.open("my_picture.jpg")
im = im.resize((im.size[0] // 2, im.size[1] // 2), Image.ANTIALIAS) # decreases width and height of the image
im.save("out.jpg", optimize=True, quality=85) # decreases its quality
然而,使用GIF格式好像不起作用。下面这段代码甚至会使out.gif
比初始的gif文件更大:
im = Image.open("my_gif.gif")
im.seek(im.tell() + 1) # loads all frames
im.save("out.gif", save_all=True, optimize=True, quality=10) # should decrease its quality
print(os.stat("my_gif.gif").st_size) # 2096558 bytes / roughly 2MB
print(os.stat("out.gif").st_size) # 7536404 bytes / roughly 7.5MB
如果我添加以下行,则只保存 GIF 的第一帧,而不是所有帧。im = im.resize((im.size[0] // 2, im.size[1] // 2), Image.ANTIALIAS) # should decrease its size
我一直在考虑在im.seek()
或im.tell()
上调用resize()
方法,但这些方法都不返回Image对象,因此我不能在它们的输出上调用resize()
方法。
您知道如何使用Pillow来缩小GIF的大小而保留所有帧吗?
[编辑]部分解决方案:
按照Old Bear的回答,我做了以下更改:
我正在使用BigglesZX的脚本来提取所有帧。值得注意的是,这是一个Python 2脚本,我的项目是用Python 3编写的(我最初提到了这个细节,但被Stack Overflow社区删除了)。运行
2to3 -w gifextract.py
使该脚本与Python 3兼容。我一直在单独调整每个帧的大小:
frame.resize((frame.size[0] // 2, frame.size[1] // 2), Image.ANTIALIAS)
我一直在保存所有帧:
img.save("out.gif", save_all=True, optimize=True)
。
新的gif已保存并可用,但存在2个主要问题:
我不确定调整大小的方法是否有效,因为
out.gif
仍然是7.5MB。最初的gif是2MB。GIF速度增加了,GIF不循环。它在第一次运行后停止。
示例:
原始gif my_gif.gif
:
处理后的gif(out.gif
) https://i.imgur.com/zDO4cE4.mp4(我无法将其添加到Stack Overflow)。Imgur使其变慢(并将其转换为mp4)。当我从电脑上打开gif文件时,整个gif持续约1.5秒。