Подтвердить что ты не робот

PHP: Как сжимать изображения без потери видимого качества (автоматически)?

Мне интересно, как автоматически определить максимальную скорость сжатия (небольшой размер файла + потеря качества).

В настоящий момент я использую imagejpeg() с $quality = 85 для каждого .jpg.

PageSpeed ​​(Chrome Plugin) предлагает, чтобы снизить качество нескольких изображений, чтобы сохранить некоторые килобайты. Процент сокращения отличается.

Я хотел бы написать cronjob, который сканирует конкретный каталог и оптимизирует каждое изображение.

Как страницы PageSpeed ​​или TinyPNG определяют наилучшее оптимизированное качество и возможно ли это с помощью PHP или другого серверного языка?

4b9b3361

Ответ 1

TinyPNG использует pngquant.

Pngquant имеет возможность установить желаемое качество, подобное JPEG. Вы можете запустить что-то вроде:

<?php system('pngquant --quality=85 image.png'); ?>

На веб-сайте Pngquant есть пример кода, показывающий, как использовать pngquant из PHP.


Для JPEG вы можете применить без потерь jpegcrush.

JpegMini (коммерческий) и jpeg-archive (бесплатно) являются потерями и могут автоматически найти минимальное качество для JPEG.

В PHP вы можете приблизительно оценить, насколько JPEG был сжат, наблюдая, как изменяется размер файла после повторного сжатия. Размер файла JPEG, сжатого с одинаковым или высоким качеством, не будет сильно изменяться (но потеряет визуальное качество).

Если вы повторно сжимаете JPEG и видите размер файла в два раза, сохраните повторно сжатую версию. Если вы видите только размер файла 10-20%, сохраните его.

Если вы сжимаете себя, используйте MozJPEG (здесь онлайн-версия).