Python中的Imageio:压缩gif

20
有没有一种方法可以在使用 imageio 制作 gif 的同时压缩它?我正在使用大约200张图像制作gif,最终文件大小为30MB。我希望它是5-10 MB。无论如何,这些图像都是单色的,因此应该可以压缩。有没有我可以使用的工具或者可以在 imageio 中指定压缩的方法?
以下是我的制作gif的代码:
    import os
    import imageio as io
    import re
    
    # Key to sort the file_names in order
    numbers = re.compile(r'(\d+)')
    def numericalSort(value):
        parts = numbers.split(value)
        parts[1::2] = map(int, parts[1::2])
        return parts
    

    file_names = sorted((fn for fn in os.listdir('.') if fn.startswith('timestamp_')), key = numericalSort)
    

    # GIF writer
    with io.get_writer('output_gif.gif', mode='I', duration=0.1) as writer:
        for filename in file_names:
            image = io.imread(filename)
            writer.append_data(image)


嘿,我已经添加了我的代码。 - jkhadka
你是否曾经找到了解决方案? - user27182
没有问题,我实际上只是将每个第$i$帧制作成了GIF以减小文件大小。你能为我提供一种方法吗? - jkhadka
这个开源工具是用C#编写的,可以很好地压缩gif。也许你可以将其中的一些算法移植到Python中。链接:https://github.com/NickeManarin/ScreenToGif - bhathiya-perera
2个回答

8

我曾经遇到同样的问题,因此我创建了一个名为pygifsicle的库,它是对gifsicle库的封装,使用方法如下:

from pygifsicle import optimize
optimize("path_to_my_gif.gif")

与 pip 上的其他软件包一样,可以通过运行以下命令进行安装:

pip install pygifsicle

使用这个库的完整示例可在imageio文档中找到。

在安装pygifsicle时,如果您使用的是MacOS,则会自动安装gifsicle库,使用Brew。对于其他系统,将提供逐步指南,基本上只需通过apt-get在Debian / Ubuntu上安装库即可(因为似乎不要求在软件包设置中使用sudo是一个好主意):

sudo apt-get install gifsicle

或者在Windows上,您可以安装其中一个可用的端口


1
你好 @AviVajpeyi,pygifsicle为gifsicle库提供绑定功能,通常能够压缩图片。在我的测试案例中,该库总是有效的,但我认为在某些情况下,压缩算法会失败。我建议您在gifsicle的Github存储库中提交此问题的请求。 - Luca Cappelletti
@LucaCappelletti 如何将其他的GIF压缩选项(如“lossy”)添加到“optimize”函数中? - Jimson James
哇塞,这真的是拯救了我60%!非常厉害;) 真的,压缩效果相当不错。 - Marco
文件未找到错误:在您的系统上没有找到gifsicle库。 在MacOS上,使用pip install命令时,它会自动使用brew进行安装。 在其他系统上,例如Linux系统和Windows系统,它将提示按照完成安装的说明进行操作。 您可以通过查看gifsicle和pygifsicle文档了解有关如何安装gifsicle的更多信息。 - Feraru Silviu Marian
是的,@FeraruSilviuMarian,这是我的库在未安装Gifsicle库时提供的非常详细的错误信息。在我的答案中,有Ubuntu、macOS和Windows的安装说明。你遇到了什么问题?可能你应该提出一个相关的问题。 - Luca Cappelletti
显示剩余5条评论

1

另一种方法是在创建gif之前调整图片的大小并降低其质量。

from PIL import Image
# Resizing
image.resize((x, y), Image.ANTIALIAS)
# Reducing Quality
quality_val = 90
image.save(filename, 'JPEG', quality=quality_val)


将图像转换为压缩 GIF 的完整代码。
from PIL import Image
import glob
x = 250
y = 250
fp_in = 'path/to/images'
fp_in = 'path/to/gif/output'
q = 50 # Quality
img, *imgs = [Image.open(f).resize((x,y),Image.ANTIALIAS) for f in sorted(glob.glob(fp_in))] 
img.save(fp=fp_out, format='GIF', append_images=imgs,quality=q, 
         save_all=True, duration=15, loop=0, optimize=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接