Рекомендация по сжатию JPG-файлов с помощью ImageMagick
Я хочу сжать файл изображения JPG с ImageMagick, но не могу получить большую разницу в размере. По умолчанию размер вывода больше, чем входной. Я не знаю, почему, но после добавления некоторых параметров профиля +и настройки качества я могу получить меньший размер, но все равно похож на оригинал.
входное изображение 255kb, обработанное изображение 264kb (с помощью +profile для удаления профилей и настройки качества до 70%). Есть ли способ сжать это изображение по крайней мере до 150kb? Есть это возможно? Какие параметры ImageMagick я могу использовать?
9 ответов
Я использую всегда:
- качество в 85
- прогрессивная (сжатие comprobed)
- очень крошечное размытие Гаусса для оптимизации размера (0,05 или 0,5 радиуса) зависит от качества и размера изображения, это особенно оптимизирует размер jpeg.
- Strip любой комментарий или 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
- это, используйте более точное дискретное косинусное преобразование с плавающей запятой, а не быструю целочисленную версию по умолчанию.
Я использую Гугл Файле PageSpeed Выводы рекомендации по оптимизации изображений, а для ImageMagick они рекомендуют следующее:
- Коэффициент выборки 4:2: 0
-полосы
- качество 85 [оно может варьироваться, я использую диапазон 60-80]
- переплетение!--6-->
-цветовое пространство 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 КБ
Я бы добавил полезную заметку и общее предложение минимизировать 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 делает приятное другое. Последняя команда я использовал:
mogrify * - sampling-factor 4:2:0-strip-quality 88-interlace Plane-define jpeg: dct-method=float-colorspace RGB-gaussian-blur 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
вы потеряете некоторое качество путем распаковывать и recompressing в дополнение к любой потере должной к значению понижать-качества от входного сигнала.