Следующий скрипт должен создать изображение с более низким качеством и меньшим размером файла (КБ), вместо этого он создает изображение с более низким качеством, но большим размером файла.
В моем тесте оригинал составляет около 300 КБ, при использовании 90% качества выход почти вдвое, а при 100% качестве более 1 МБ …
<?php
$quality = 90;
$path = '/var/www/TEST/';
$inputSrc = $path . 'original.jpg';
$outputSrc = $path . 'after' . $quality . '.jpg';
$handler = imagecreatefromjpeg($inputSrc);
imagejpeg($handler, $outputSrc, $quality);
Я предполагаю, что проблема связана с imagejpeg
плохая реализация …
ImageMagick
лучшее решение?Спасибо
Обновить
Мне было любопытно, поэтому я попробовал ImageMagick
и, к сожалению, у меня похожий результат (чуть лучше).
Полные результаты теста:
Оригинальный размер: 294.6Кб
Обновление 2
Я провел еще один тест с GIMP и выяснил, что для того, чтобы получить файл очень похожий по размеру с оригинальным, вы должны проверить опцию use quality setting from original image
,
Теперь я запутался еще … так как при выборе этой настройки Gimp автоматически меняет качество вывода на 74% (для примера изображения).
Я предполагал, что значение качества JPEG, если оно ниже 100%, снижает качество изображения при каждой итерации сохранения … но я начинаю думать, что я ошибаюсь.
Обновление 3
С ImageMagick
не нужно указывать качество образца и если оставить его пустымImageMagick
будет использовать то же качество, что и входное изображение.
Таким образом, для примера изображения оно определяется как качество 69, а выходной файл 326kb. Это лучший результат на данный момент.
Вот изображение, которое я использую:
Я немного посмотрел на это. Вы можете работать в обратном направлении в ImageMagick и, вместо того, чтобы определять качество и видеть, какой размер получится, вы можете определить размер и посмотреть, какое качество получится. Таким образом, для конкретного примера вы можете сказать, что хотите, чтобы размер выходного файла не превышал 100 КБ, например:
convert MShRR.jpg -define jpeg:extent=100k out.jpg
и вы получите 99 КБ, как это:
-rw-r--r--@ 1 mark staff 294608 14 Jan 09:36 MShRR.jpg
-rw-r--r--@ 1 mark staff 99989 14 Jan 09:44 out.jpg
На мой взгляд, полученное изображение немного постеризовано:
Вы часто можете добавить небольшое количество размытия, чтобы скрыть это, следующим образом:
convert MShRR.jpg -blur x0.5 -define jpeg:extent=100k out.jpg
YMMV — Ваш пробег может меняться !!!
Других решений пока нет …