Google работал на нескольких фронтах, чтобы уменьшить объем данных и изображений, следовательно они будут быстрее загружаться из интернета, над такими проектами, как алгоритм Zopfli производящий небольшие файлы PNG & gzip, или алгоритм сжатия изображений WebP обеспечивающим лучшую степень сжатия по сравнению с PNG и более качественное сжатие по сравнению с JPEG, но это потребует обновления поддержки клиентов, таких как веб браузеры. Теперь Google представил алгоритм Guetzli способный производить JPEG файлы на 20-35% меньше по сравнению с libjpeg, с таким же качеством и все еще совместимым с форматом JPEG.
На изображении выше показан крупным планом образцы, JPEG картинка сжатая с помощью libjpeg имеет артефакты вокруг линии, JPEG картинка сжатая с помощью Guetzli имеет меньше артефактов.
Вы можете узнать больше об алгоритме в документе под названием “Guetzli: Perceptually Guided JPEG Encoder“, или почитать аннотацию ниже:
Guetzli это новый JPEG кодер производящий визуально неразличимые изображения с более низким битрейтом по сравнению с с другими JPEG кодерами. Он оптимизирует глобальные таблицы квантования JPEG и DCT коэффициент значений в каждом блоке JPEG используя замкнутый оптимизатор. Guetzli использует Butteraugli, дистанцию восприятия метрики, в качестве источника обратной связи в процессе оптимизации. Мы достигли на 29-45% меньший объем данных для заданного расстояния перспективы, по данным Butteraugli, по сравнению с другими компрессорами испробованными нами. На данный момент Guetzli работает довольно таки медленно, что ограничивает его применимость для сжатия статичного контента и служит доказательством концепции, что мы можем достигнуть значительного сокращения размера, комбинируя расширенные техники психовизуальных моделей с потерями сжатия.
Данный способ сжатия медленнее чем libjpeg или libjpeg-turbo, но поскольку в интернете файл обычно сжимается один раз, а все остальное время распаковывается, это не так важно. Еще одним ограничением является то, что он не поддерживает прогрессивную JPEG кодировку.
Вы можете установить Guetzli самостоятельно, так как его код представлен на github. Там есть сборка инструмента для Ubuntu 16.04:
1 2 3 4 |
sudo apt install libpng-dev libgflags-dev git build-essential git clone https://github.com/google/guetzli/ cd guetzli make |
Вы найдете исполняемый файл в папке bin/release, запустите его чтобы увидеть все возможные настройки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
./bin/Release/guetzli guetzli: Guetzli JPEG compressor. Usage: guetzli [flags] input_filename output_filename Flags from /build/gflags-YYnfS9/gflags-2.1.2/src/gflags.cc: -flagfile (load flags from file) type: string default: "" -fromenv (set flags from the environment [use 'export FLAGS_flag1=value']) type: string default: "" -tryfromenv (set flags from the environment if present) type: string default: "" -undefok (comma-separated list of flag names that it is okay to specify on the command line even if the program does not define a flag with that name. IMPORTANT: flags in this list that have arguments MUST use the flag=value format) type: string default: "" Flags from /build/gflags-YYnfS9/gflags-2.1.2/src/gflags_completions.cc: -tab_completion_columns (Number of columns to use in output for tab completion) type: int32 default: 80 -tab_completion_word (If non-empty, HandleCommandLineCompletions() will hijack the process and attempt to do bash-style command line flag completion on this value.) type: string default: "" Flags from /build/gflags-YYnfS9/gflags-2.1.2/src/gflags_reporting.cc: -help (show help on all flags [tip: all flags can have two dashes]) type: bool default: false -helpfull (show help on all flags -- same as -help) type: bool default: false -helpmatch (show help on modules whose name contains the specified substr) type: string default: "" -helpon (show help on the modules named by this flag value) type: string default: "" -helppackage (show help on all modules in the main package) type: bool default: false -helpshort (show help on only the main module for this program) type: bool default: false -helpxml (produce an xml version of help) type: bool default: false -version (show version and build info and exit) type: bool default: false Flags from guetzli/guetzli.cc: -quality (Visual quality to aim for, expressed as a JPEG quality value.) type: double default: 95 -verbose (Print a verbose trace of all attempts to standard output.) type: bool default: false |
Вы идеале лучше использовать сырое или сжатое без потерь изображение, потому первый тест был проведен с фотографией с камеры:
1 2 3 |
./bin/Release/guetzli IMG_4354.JPG IMG_4354-Guetzli.JPG Invalid input JPEG file Guetzli processing failed |
В итоге была выдана ошибка JPEG файла, поэтому был использован другой файл (1920×1080 PNG файл):
1 2 3 4 5 6 |
time ./bin/Release/guetzli MINIX-Launcher3.png MINIX-Launcher3-guetzli.jpg real 2m58.594s user 2m55.840s sys 0m2.616s |
Это одно-поточный процесс и занимает много времени (около 3 минут на процессоре AMD FX8350), по крайней мере, с текущей реализацией. Возможно вы захотите запустить его с опцией “verbose” чтобы удостовериться, что он не мертв.
Тест был повторен с использованием качества конвертации 95, так как оно используется в Guetzli по умолчанию:
1 2 3 4 5 |
time convert -quality 95 MINIX-Launcher3.png MINIX-Launcher3-convert.jpg real 0m0.128s user 0m0.112s sys 0m0.012s |
Файл сжатый с помощью Guetzli действительно примерно на 15% меньше и должен иметь аналогичное качество:
1 2 3 4 |
ls -lh MINIX-Launcher3* -rw-rw-r-- 1 jaufranc jaufranc 534K Mar 17 11:45 MINIX-Launcher3-convert.jpg -rw-rw-r-- 1 jaufranc jaufranc 453K Mar 17 11:41 MINIX-Launcher3-Guetzli.jpg -rw-rw-r-- 1 jaufranc jaufranc 1.5M Mar 17 11:35 MINIX-Launcher3.png |
Выражаем свою благодарность источнику с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.