使用Pillow操作 Webp 图片发生内存泄露,使用 bash 将 webp 文件修改成 png 格式

一个简单的脚本,类似

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from PIL import Image

if __name__ == '__main__':
    dir_name = sys.argv[1]
    for i in os.listdir(dir_name):
        with open('%s/%s' % (dir_name, i),'rb') as e:
            if os.path.isfile('%s/%s.png' % (dir_name, i.split('.')[0])):
                continue
            im = Image.open(e).convert('RGB')
            im.save('%s/%s.png' % (dir_name, i.split('.')[0]))
            del im

意图是将某个文件夹下的所有 webp 的图片都转化成 png 格式,需要转化的原因是某些浏览器(如 Safari)不支持 webp,于是得将辛苦转好的 webp 格式的图片转成 png.
一开始使用 Python 的原因是我有大约三万张图片,如果单进程跑的话有点太慢了,于是使用了python 的多进程。结果内存打满。后减少进程数,内存同样打满,最后简化成了如上的代码,内存也缓慢趋向于满。
于是去 Github 上搜索了一下,发现这个是一个Pillow 的一个 bug,已经接收了修复的 pr不过没有发布新版本。于是对 Pillow 失去信息。转用 bash 实现。首先安装 Google 提供的工具 webp

sudo apt install webp

然后使用 find 命令和 -exec 参数就好啦

find ./ -name *.webp -exec dwebp {} -o {}.png

还有一点问题就是这样会有两个后缀名. 例如 18YearGirl.webp 会变成 18YearGirl.webp.png.
这个再写一个 bash 脚本就好了啦 hhh

find ./ -name "*.png" | awk -F "." '{print $1}' | xargs -i -t mv ./{}.webp.png  ./{}.png

记得要将 ./ 换成图片所在的目录哦~~

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注