Если вы хотите, чтобы они выполнялись быстро, используйте vips
.Итак, взяв ваше изображение 1920x1080 и используя vips
в Терминале:
vips webpsave autumn.jpg autumn.webp --Q 70
Это займет 0,3 с на моем MacBook Pro, т.е. это в 10 раз быстрее, чем 3 с, достигнутые вашей реализацией PIL.
Если вы хотите, чтобы лоты выполнялись очень быстро, используйте GNU Parallel и vips
.Итак, я сделал 100 копий вашего изображения и преобразовал весь лот в WEBP параллельно следующим образом:
parallel vips webpsave {} {#}.webp --Q 70 ::: *jpg
Это заняло 4,9 с на 100 копий вашего изображения, т.е. это в 50 раз быстрее, чем 3 с вашегоРеализация PIL достигает.
Вы также можете использовать привязку 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)
Требуется 3,3 с, чтобы преобразовать 100 копий вашего изображения в эквиваленты WEBP на моем 12-ядерном MacBook Pro с диском NVME.