Есть ли быстрый способ конвертировать изображение в WEBP? - PullRequest
0 голосов
/ 05 февраля 2019

На моем веб-сайте я сейчас преобразую свои загружаемые изображения в 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 секунды, чтобы преобразовать следующее изображение:

860 Кбайт, 1920 x 1080

Myоперативная память 8 ГБ, с процессором с 4 ядрами (Intel I5), без графического процессора.

Я использую Pillow==5.4.1.

Есть ли более быстрый способ конвертировать изображение в WEBB?еще быстрее.2,8 с, кажется, долго ждать.

enter image description here

1 Ответ

0 голосов
/ 05 февраля 2019

Если вы хотите, чтобы они выполнялись быстро, используйте 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.

...