提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
提示:这里可以添加本文要记录的大概内容:
最近项目上有一个需求,需要将一堆图片生成GIF用于时序分析,但是在PNG图片太大的情况下很容易内存爆炸,于是乎想着用python的pillow库包来处理下,整个还是很简单的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、下载并安装pillow库包
pip3 install pillow
二、使用步骤
1.创建函数
整体思路很简单:
- 寻找输入文件夹下的所有图片,我设定是png格式,其他格式自己随意调整;
- 基于推导式依次用pillow的Image方法打开图片并将对象存放到列表中;
- 对数据进行缩略下采样,因为不想生成的GIF太大,所以需要处理下数据;
- 保存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")
三、出现的问题以及解决方案
- 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
- 由于项目需要,需要打包成linux可执行文件,所以我在之前创建的docker容器中进行打包,由于没有考虑到GLIBC库版本问题,导致无法在宿主机执行的问题。经检查,我的docker容器的GLIBC库版本是2.31,宿主机GLIBC版本是2.17,导致python编译的时候是基于2.31,GLIBC的特性是无法向下兼容,也就是高版本编译的无法在低版本上运行,所以会报错,但是低版本编译打包的可以在高版本上运行。所以解决方案也很简单,就是找一个低版本GLIBC库的环境进行打包,我就是在宿主机上conda新建一个虚拟环境,安装必须的库包然后进行打包,目前就完美运行。千万记住,打包python文件的时候最好新建一个虚拟环境,只安装必要的库包,避免执行文件过于臃肿,我没新建虚拟环境之前打包的文件有300M,但是打新建虚拟环境之后的打包文件只有10多M。
四、文件内容
对于比较懒的同学,私信我发给你基于GLIBC2.17版本编译的可执行文件。