imagemagick — PHP GD imagejpeg: размер выходного файла больше исходного

Следующий скрипт должен создать изображение с более низким качеством и меньшим размером файла (КБ), вместо этого он создает изображение с более низким качеством, но большим размером файла.

В моем тесте оригинал составляет около 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Кб

  • GD (imagejpeg) 90%: 581,7 Кб
  • GD (imagejpeg) 100%: 1,1 МБ
  • ImageMagick 90%: 431,7 Кб
  • ImageMagick 100%: 780,9 КБ

Обновление 2

Я провел еще один тест с GIMP и выяснил, что для того, чтобы получить файл очень похожий по размеру с оригинальным, вы должны проверить опцию use quality setting from original image,

Теперь я запутался еще … так как при выборе этой настройки Gimp автоматически меняет качество вывода на 74% (для примера изображения).
Я предполагал, что значение качества JPEG, если оно ниже 100%, снижает качество изображения при каждой итерации сохранения … но я начинаю думать, что я ошибаюсь.

Обновление 3

С ImageMagick не нужно указывать качество образца и если оставить его пустымImageMagick будет использовать то же качество, что и входное изображение.
Таким образом, для примера изображения оно определяется как качество 69, а выходной файл 326kb. Это лучший результат на данный момент.

Вот изображение, которое я использую:

введите описание изображения здесь

2

Решение

Я немного посмотрел на это. Вы можете работать в обратном направлении в 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 — Ваш пробег может меняться !!!

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]