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

Vin*_*ais 3 image-conversion python-imaging-library python-2.7

在我的网站中,我现在将上传的图像转换为 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)
Run Code Online (Sandbox Code Playgroud)

转换以下图像需要 2.8 秒:

860KB,1920 x 1080

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

我在用着Pillow==5.4.1

有没有更快的方法可以更快地将图像转换为 WEBB。2,8秒,看来等的时间太长了。

在此输入图像描述

Mar*_*ell 5

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

vips webpsave autumn.jpg autumn.webp --Q 70
Run Code Online (Sandbox Code Playgroud)

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

如果您希望快速完成大量工作,请使用GNU Parallelvips. 因此,我制作了 100 个图像副本,并将全部图像并行转换为 WEBP,如下所示:

parallel vips webpsave {} {#}.webp --Q 70 ::: *jpg
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

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

#!/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)
Run Code Online (Sandbox Code Playgroud)

在我配备 NVME 磁盘的 12 核 MacBook Pro 上,需要 3.3 秒才能将 100 个图像副本转换为 WEBP 等效项。