Рекомендации по сжатию файлов JPG с помощью ImageMagick - PullRequest
204 голосов
/ 31 августа 2011

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

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

Ответы [ 9 ]

393 голосов
/ 31 августа 2011

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

  • качество в 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, т. Е. Используйте более точное дискретное косинусное преобразование с плавающей запятой, а не версию по умолчанию с быстрым целым числом.

43 голосов
/ 26 мая 2017

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

-sampling-factor 4: 2: 0
-strip
-качество 85 [может варьироваться, я использую диапазон 60-80]
-интерлейсинг
-цветное пространство RGB

Команда в ImageMagick:

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

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

16 голосов
/ 26 ноября 2014

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

$im -> gaussianBlurImage(0.8, 10);      //blur
$im -> setImageCompressionQuality(85);  //set compress quality to 85
12 голосов
/ 27 августа 2013

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

  • Исходный размер файла: 2800 кБ
  • Разрешение: 3264x2448

Команда:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Размер файла результата 753 кБ
  • Разрешение 2048x2048

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

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

9 голосов
/ 07 января 2015

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

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

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

7 голосов
/ 08 августа 2017

Я добавил -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 = 845 КБ

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

4 голосов
/ 21 октября 2017

@ 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

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

3 голосов
/ 08 марта 2018

Вот полное решение для тех, кто использует 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);
  }
}
3 голосов
/ 21 июня 2017

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

mogrify * -сэмплинг-фактор 4: 2: 0 -полосная полоса -качественность 88-плоскость чередования -определить jpeg: dct-method = float -colorspace RGB -gaussian-blur 0,05

Без размытия по Гаузи при 0,05 оно составляло около 261 КБ, а при этом - около 171 КБ для изображения, на котором я тестировал.Визуальные различия на мониторе 1440p с большим сложным изображением не заметны, пока вы не приблизите изображение.

...