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

17

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

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

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

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

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

    
задан Mr. B. 31.10.2013 в 01:10
источник
  • Вы уже кэшируете вызовы imagejpeg (), правильно? –  Pekka 웃 31.10.2013 в 01:12
  • @Pekka: да, я знаю. Я бы изменил размер изображений с качеством 100%. Cronjob оптимизировал его позже. 85% качество - только потому, что у меня пока нет алгоритма. –  Mr. B. 31.10.2013 в 01:13

1 ответ

27

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

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

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

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

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

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

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

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

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

    
ответ дан Kornel 31.10.2013 в 01:24
источник
  • Я пробовал jpegcrush, но он кажется неэффективным. этот скрипт perl помогает мне уменьшить только 10 процентов от размера файла. Jpegmini и tinyjpg могут делать до 70%. Любой бесплатный лучший скрипт может это сделать? –  TomSawyer 21.03.2016 в 12:11
  • @TomSawyer jpegcrush без потерь и получает наилучшее соотношение размеров файлов и качества. Других нет, и они эквивалентны повторному сохранению файла с более низким качеством, добавлению большего количества искажений и потенциально более низкому соотношению файлов / качеств. Если инструмент сэкономит вам 70% на вашем JPEG, это означает, что вы создали файл с расточительно высоким качеством настройки. –  Kornel 21.03.2016 в 12:21
  • Я так не думаю. Я попытался сжать много файлов с помощью jpgmini и tinyjpg, и почти из них будут сжаты в аренду на 50%, а качество будет одинаковым, или вы можете сказать, что отличается вашими человеческими глазами. Два вышеупомянутых сервиса уменьшают размер файла на 70%, но jpegcrush может сделать до 10%. Вы должны попробовать два вышеуказанных сервиса, чтобы увидеть разницу –  TomSawyer 21.03.2016 в 15:30
  • @TomSawyer, когда я говорю «lossless / lossy», я имею в виду контекст терминологии сжатия, где «без потерь» означает 100% пикселей, точно побито одинаковых, а не «похожих на меня». Потеря деталей, которые вы не видите невооруженным глазом, хороша, но по какой-то причине она называется потерянной. –  Kornel 22.03.2016 в 19:37