闲来无事,整一个GIF生成脚本

本文介绍了如何使用Python的Pillow库处理大量PNG图片生成GIF,以避免内存问题。作者分享了遇到的PIL.Image.DecompressionBombError问题及解决方案,包括设置Image.MAX_IMAGE_PIXELS限制和在适当GLIBC版本环境中打包可执行文件。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

文章目录

前言

一、下载并安装pillow库包

二、使用步骤

1.创建函数

2.主函数调用

三、出现的问题以及解决方案

四、文件内容


前言

提示:这里可以添加本文要记录的大概内容:

最近项目上有一个需求,需要将一堆图片生成GIF用于时序分析,但是在PNG图片太大的情况下很容易内存爆炸,于是乎想着用python的pillow库包来处理下,整个还是很简单的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、下载并安装pillow库包

pip3 install pillow

二、使用步骤

1.创建函数

整体思路很简单:

  1. 寻找输入文件夹下的所有图片,我设定是png格式,其他格式自己随意调整;
  2. 基于推导式依次用pillow的Image方法打开图片并将对象存放到列表中;
  3. 对数据进行缩略下采样,因为不想生成的GIF太大,所以需要处理下数据;
  4. 保存GIF。
def CreateGif(in_dir, out_gif):
    """
    :param in_dir: 输入文件目录
    :param out_gif: 输出GIF文件地址
    :return: 
    """
    files = glob.glob(os.path.join(in_dir, '*.png'))  # 获取所有PNG图片,其他格式自己修改即可
    imgs = [Image.open(i) for i in files]  # 推导式依次打开所有数据
    [i.thumbnail((1000, 800)) for i in imgs]  # 对数据进行缩略重采样
    imgs[0].save(
        out_gif,
        save_all=True, append_images=imgs)

2.主函数调用

这里因为是想给到后端调用,所以用了获取命令行参数的方式得到对应参数。

if __name__ == '__main__':
    time1 = time.time()
    inf, ouf = sys.argv[1], sys.argv[2]
    CreateGif(inf, ouf)
    time2 = time.time()
    print(f"耗时:{time2 - time1:0.2f}s")

三、出现的问题以及解决方案

  1. pillow库读取png的时候有保护机制,超过默认像素大小会报错,如下所示
    PIL.Image.DecompressionBombError: Image size (351062370 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.

    所以需要在代码开头设置下最大像素,这个可以个人酌情设置

    Image.MAX_IMAGE_PIXELS = 933120000
  2. 由于项目需要,需要打包成linux可执行文件,所以我在之前创建的docker容器中进行打包,由于没有考虑到GLIBC库版本问题,导致无法在宿主机执行的问题。经检查,我的docker容器的GLIBC库版本是2.31,宿主机GLIBC版本是2.17,导致python编译的时候是基于2.31,GLIBC的特性是无法向下兼容,也就是高版本编译的无法在低版本上运行,所以会报错,但是低版本编译打包的可以在高版本上运行。所以解决方案也很简单,就是找一个低版本GLIBC库的环境进行打包,我就是在宿主机上conda新建一个虚拟环境,安装必须的库包然后进行打包,目前就完美运行。千万记住,打包python文件的时候最好新建一个虚拟环境,只安装必要的库包,避免执行文件过于臃肿,我没新建虚拟环境之前打包的文件有300M,但是打新建虚拟环境之后的打包文件只有10多M。

四、文件内容

对于比较懒的同学,私信我发给你基于GLIBC2.17版本编译的可执行文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值