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


246

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

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


3
Повторное сжатие JPEG всегда приводит к ухудшению изображения, даже если оно больше. Было бы лучше, если бы вы могли начать с оригинала, прежде чем он был сохранен в первый раз.
Марк Рэнсом

Я знаю, но, к сожалению, у меня нет исходного изображения, все, что у меня есть, это большой файл JPG, но я думаю, что я могу получить хороший баланс между качеством и размером
Javis Perez

Ответы:


440

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

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

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

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

или в более новой версии:

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

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

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

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


2
Спасибо! этот код дал мне изображение размером 170 КБ, теперь я могу пойти и поэкспериментировать с вашим кодом, спасибо, также я нашел опцию -define: экстент = MAX_SIZE_IN_KB, которая действительно помогает, спасибо!
Хавис Перес

36
Если вы делаете кучу файлов, вы также можете сделать mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Убедитесь, что у вас есть резервная копия перед выполнением этой команды. Будет писать на месте.
Ричард Айотт

3
-stripсделал это для меня. Спасибо
Найджел Анхель

38
Я получил очень размытые изображения. Кажется контрпродуктивным намеренно размыть изображение, чтобы сэкономить место. Разве не имеет смысла просто использовать менее качественный%? Процесс изменения качества довольно хорош при экономии места при сохранении очевидного качества изображения. Я добавил 0,05 гауссовского размытия на свое изображение, и оно сэкономило место, но выглядело как полная чушь. Я остановился на использовании mogrify -strip -quality 75% *.jpg. Газа это здорово. 0 потеря качества и большая экономия места. А качество на 75% едва ли можно отличить от 100%, но занимает половину пространства.
Баттл Буткус

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

67

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

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

Команда в ImageMagick:

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

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


16

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

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

14

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

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

Команда:

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

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

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


Вам не нужно добавлять «-фильтр Lanczos». Он установлен по умолчанию imagemagick.org/script/command-line-options.php#filter
Илья Прокин

как было сказано выше - бесполезно уменьшать разрешение изображения, чтобы уменьшить размер файла. Вместо этого уменьшите качество JPEG! Вы можете проверить это сами - сравните два изображения: одно с 97% JPEG, а другое конвертировано в, скажем, 68%, и вам действительно будет трудно увидеть любые пиксели отличающимися, даже если вы посмотрите на 100% увеличение! Настройки стоковой
дисками

10

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

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

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


Я использовал pngquant для Linux. На него ссылались на странице ImageAlpha. Спасибо за подсказку
Александр Рыхлицкий

8

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

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


5

@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

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


4

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

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

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


Обратите внимание, что размытие по Гауссу плохо работает с маленькими изображениями, но для больших должно быть!
Антонин ГАВРЕЛЬ

4

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

0

Если изображение имеет большие размеры, трудно получить хорошие результаты без изменения размера, ниже приведено 60-процентное изменение размера, которое для большинства целей не разрушает слишком много изображения.

Я использую это с хорошим результатом для полутоновых изображений (я конвертирую из PNG):

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace Gray -quality 20  {}.jpg

Я использую это для отсканированных черно-белых страниц, чтобы получить их в полутоновых изображениях (дополнительные аргументы убирают тени с предыдущих страниц):

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace Gray -quality 20 -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg 

Я использую это для цветных изображений:

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace RGB -quality 20  {}.jpg 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.