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

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

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

Ответ 1

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

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

Ответ 2

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

-сэмплинг-фактор 4: 2: 0
 -strip
 -качество 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 без значительных потерь.

Ответ 3

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

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

Ответ 4

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

  • Оригинальный размер файла: 2800 kB
  • Разрешение: 3264x2448

Команда:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Result filesize 753 kB
  • Разрешение 2048x2048

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

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

Ответ 5

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

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

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

Ответ 6

Я добавил -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,913KB
  • img_resized.jpg = 845KB

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

Ответ 7

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

mogrify * -sampling-factor 4: 2: 0 -strip -quality 88 -interlace Plane -define jpeg: dct-method = float -colorspace RGB -gussian-blur 0.05

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

Ответ 8

@JavisPerez - Есть ли способ сжать это изображение до 150kb по крайней мере? В том, что возможное? Какие параметры 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

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

Ответ 9

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

Ответ 10

Если изображение имеет большие размеры, трудно добиться хороших результатов без изменения размера, ниже приведено 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