有没有快速的方法将图像转换为WEBP?

Is there a fast way to convert a image into WEBP?

在我的网站上,我现在正在将我上传的图片转换为 webp,因为它比其他格式小,用户将更快地加载我的页面(也包括移动用户)。但是转换中等图像需要一些时间。

import StringIO
import time

from PIL import Image as PilImage

img = PilImage.open('222.jpg')

originalThumbStr = StringIO.StringIO()

now = time.time()
img.convert('RGBA').save(originalThumbStr, 'webp', quality=75)
print(time.time() - now)

转换下图需要 2.8 秒:

860kbytes, 1920 x 1080

我的内存是 8GB 内存,处理器是 4 核(Intel I5),没有 GPU。

我正在使用 Pillow==5.4.1

有没有更快的方法可以更快地将图像转换为WEBB。 2,8s 好久不见

如果您希望它们快速完成,请使用 vips。因此,拍摄 1920x1080 图像并在终端中使用 vips

vips webpsave autumn.jpg autumn.webp --Q 70

这在我的 MacBook Pro 上需要 0.3 秒,也就是说,它比您的 PIL 实现实现的 3 秒快 10 倍。

如果您想要非常快地完成大量工作,请使用 GNU Parallelvips。所以,我复制了 100 份你的图片,并像这样并行地将所有图片转换为 WEBP:

parallel vips webpsave {} {#}.webp --Q 70 ::: *jpg

100 个图像副本用了 4.9 秒,也就是说,它比您的 PIL 实现实现的 3 秒快 50 倍。


您也可以使用 pyvips 绑定——我不是这方面的专家,但这很有效并且也需要 0.3 秒:

#!/usr/bin/env python3

import pyvips

# VIPS
img = pyvips.Image.new_from_file("autumn.jpg", access='sequential')
img.write_to_file("autumn.webp")

因此,我最好的建议是采用上面的 2 行代码并使用多处理池或多线程方法来处理整个目录的图像。可能看起来像这样:

#!/usr/bin/env python3

import pyvips
from glob import glob
from pathlib import Path
from multiprocessing import Pool

def doOne(f):
   img = pyvips.Image.new_from_file(f, access='sequential')
   webpname = Path(f).stem + ".webp"
   img.write_to_file(webpname)

if __name__ == '__main__':
    files = glob("*.jpg")
    with Pool(12) as pool:
        pool.map(doOne, files)

在我带有 NVME 磁盘的 12 核 MacBook Pro 上,将 100 个图像副本转换为 WEBP 等价物需要 3.3 秒。