【发布时间】:2017-06-02 19:12:37
【问题描述】:
我有一个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's response,我做了以下改动:
我正在使用BigglesZX's script 提取所有帧。值得注意的是,这是一个 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 现在已保存并可以使用,但有两个主要问题:
我不确定调整大小的方法是否有效,因为
out.gif仍然是 7.5MB。初始 gif 为 2MB。gif 速度提高,gif 不循环。它在第一次运行后停止。
例子:
原图my_gif.gif:
处理后的 Gif (out.gif) https://i.imgur.com/zDO4cE4.mp4(我无法将其添加到 Stack Overflow 中)。 Imgur 使它变慢(并将其转换为 mp4)。当我从我的电脑打开 gif 文件时,整个 gif 持续大约 1.5 秒。
【问题讨论】:
-
你能上传你想要调整大小的 GIF 文件吗?
-
@JeruLuke 我已经添加了 GIF 文件。
标签: python image-processing gif pillow