有没有快速的方法将图像转换为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 Parallel 和 vips
。所以,我复制了 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 秒。
在我的网站上,我现在正在将我上传的图片转换为 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 Parallel 和 vips
。所以,我复制了 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 秒。