Рекомендации по сжатию JPG файлов с помощью ImageMagick


Я хочу сжать файл изображения JPG с помощью ImageMagick, но не могу получить большую разницу в размере. По умолчанию выходной размер больше входного. Я не знаю, почему, но после добавления некоторых параметров профиля +и настройки качества я могу получить меньший размер, но все же похож на оригинал.

входное изображение 255кб, обработанное изображение 264кб (используя +профиль для удаления профилей и настройки качества до 70%). Есть ли способ сжать это изображение до 150 КБ, по крайней мере? Есть это возможно? Какие параметры ImageMagick я могу использовать?

9 167

9 ответов:

Я использую всегда:

  • качество в 85
  • прогрессивный (сжатие в сжатие)
  • очень крошечное размытие Гаусса для оптимизации размера (0,05 или 0,5 радиуса) зависит от качества и размера изображения, это особенно оптимизирует размер jpeg.
  • лишить любой комментарий или exif тег

в imagemagick должно быть

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% source.jpg result.jpg

надеюсь, это будет полезно.

ссылка на источник: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

от @Fordi в комментариях (не забудьте показать свой комментарий, если хотите): Если вам не нравится размытие, используйте -sampling-factor 4:2:0 вместо. То, что это делает, уменьшает разрешение канала цветности до половины, не путаясь с разрешением яркости, на которое ваши глаза цепляются. Если вы хотите повысить точность преобразования, вы можете получить небольшое улучшение без увеличения размера файла, указав -define jpeg:dct-method=float - это, используйте более точное дискретное косинусное преобразование с плавающей запятой, а не быструю целочисленную версию по умолчанию.

Я использую Google Pagespeed Insights рекомендации по оптимизации изображений, и для ImageMagick они рекомендуют следующее:

- Коэффициент выборки 4:2: 0
- раздевайся
- качество 85 [оно может варьироваться, я использую диапазон 60-80]
- переплетение
- colorspace RGB

команда в ImageMagick:

convert image.jpg -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB image_converted.jpg

С этими опциями я получаю до 40% экономии в формате JPEG без особых видимых потерь.

просто говорю для тех, кто использует класс Imagick в PHP:

$im -> gaussianBlurImage(0.8, 10);      //blur
$im -> setImageCompressionQuality(85);  //set compress quality to 85

однажды мне нужно было изменить размер фотографий с камеры для разработки:

  • оригинальный размер файла: 2800 КБ
  • разрешение: 3264x2448
:
mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • размер файла результата 753 КБ
  • разрешение 2048x2048

и я не вижу никаких изменений в полноэкранном режиме с моим монитором разрешения 1920x1080. Разрешение 2048 является лучшим для разработки фотографий 10 см при максимальном качестве 360 dpi. Я не хочу раздень его.

Edit: я заметил, что я даже получаю гораздо лучшие результаты без размытия. Без размытости размер составляет 50% от оригинала, но качество лучше (при масштабировании).

Я бы добавил полезную боковую заметку и общее предложение минимизировать JPG и PNG.

прежде всего, ImageMagick читает (или лучше "угадать"...) входной уровень сжатия jpeg и так, если вы не добавляете -quality NN вообще, выход должен использовать тот же уровень, что и вход. Иногда может быть важной особенностью. В противном случае уровень по умолчанию -quality 92 (см. www.imagemagick.org)

предложение о действительно удивительном бесплатный инструмент ImageOptim, а также для пакетной обработки.
Вы можете получить меньшие jpgs (и pngs, а также, особенно после использования free ImageAlpha [не пакетный процесс] или Pngyu если вам нужна пакетная обработка).
Мало того, эти инструменты предназначены для Mac и Win и в командной строке (я предлагаю установить с помощью квас а затем поиск в формулах заваривания).

добавил -adaptive-resize 60% к предложенной команде, но с -quality 60%.

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg

таковы были мои результаты

  • img_original.jpg = 13,913 КБ
  • img_resized.jpg = 845KB

Я не уверен, что это преобразование слишком сильно разрушает мой образ, но я честно не думал, что мое преобразование выглядело как дерьмо. Это была широкоугольная Панорама, и я не заботился о тщательной обструкции.

вот полное решение для тех, кто использует Imagick в PHP:

$im = new \Imagick($filePath);
$im->setImageCompression(\Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(85);
$im->stripImage();
$im->setInterlaceScheme(\Imagick::INTERLACE_PLANE);

// Try between 0 or 5 radius. If you find radius of 5 
// produces too blurry  pictures decrease to 0 until you 
// find a good balance between size and quality. 
$im->gaussianBlurImage(0.05, 5);



// Include this part if you also want to specify a maximum size for the images

$size = $im->getImageGeometry();
$maxWidth = 1920;
$maxHeight = 1080;


// ----------
// |        |
// ----------
if($size['width'] >= $size['height']){
  if($size['width'] > $maxWidth){
    $im->resizeImage($maxWidth, 0, \Imagick::FILTER_LANCZOS, 1);
  }
}


// ------
// |    |
// |    |
// |    |
// |    |
// ------
else{
  if($size['height'] > $maxHeight){
    $im->resizeImage(0, $maxHeight, \Imagick::FILTER_LANCZOS, 1);
  }
}

сделал некоторые эксперименты на себе здесь и мальчик, что Gausian размытие сделать приятно другому. Последняя команда, которую я использовал, была:

однако существует * -отбор проб-Фактор 4:2:0 -прокладка -качество 88 -интерлейс плоскости -определение формата JPEG:ДКП-способ=поплавок -цветовое пространство RGB -гауссова размытия 0.05

без размытия Gausian в 0.05 это было около 261kb,с ним это было около 171KB для изображения, которое я тестировал. Визуальной разницы на мониторе 1440p с большим сложным изображением нет заметно, пока вы не увеличите путь.

@JavisPerez -- есть ли способ сжать это изображение до 150 КБ, по крайней мере? Заключаться в том возможно? Какие параметры ImageMagick я могу использовать?

см. следующие ссылки, где есть опция в ImageMagick, чтобы указать желаемый размер выходного файла для записи в JPG файлы.

http://www.imagemagick.org/Usage/formats/#jpg_write http://www.imagemagick.org/script/command-line-options.php#define

-define jpeg:extent={size} As of IM v6.5.8-2 you can specify a maximum output filesize for the JPEG image. The size is specified with a suffix. For example "400kb".

convert image.jpg -define jpeg:extent=150kb result.jpg

вы потеряете некоторое качество при распаковке и повторном сжатии в дополнение к любой потере из-за снижения значения качества от входа.