Рекомендація щодо стиснення файлів 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: obseg = MAX_SIZE_IN_KB, яка дійсно допомагає, дякую!
Javis Perez

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%, але займає половину місця.
Buttle Butkus

80
Якщо ви не любите розмиття, замість цього використовуйте -sampling-фактор 4: 2: 0. Це означає зменшити роздільну здатність каналу кольоровості до половини, не возившись з роздільною здатністю яскравості, на яку ваші очі застібаються. Якщо ви хочете кращої достовірності перетворення, ви можете отримати незначне поліпшення без збільшення розміру файлів, вказавши -define jpeg: dct-method = float - тобто використовувати більш точне дискретне косинусне перетворення з плаваючою точкою, а не швидкий за замовчуванням ціла версія.
Форді

67

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

-симплінг-коефіцієнт 4: 2: 0
-смужка -якість
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

Просто кажучи для тих, хто використовує клас 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 кБ
  • Дозвіл 2048х2048

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

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


Вам не потрібно додавати "-filter Lanczos". Він встановлений за замовчуванням imagemagick.org/script/command-line-options.php#filter
Ілля Прокін

як було сказано вище - знижувати роздільну здатність зображення марно, щоб зменшити файл. Замість цього знижте якість JPEG! Ви можете перевірити це самостійно - порівняйте два зображення з 97% JPEG, а інше перетворене, скажімо, на 68%, і вам справді буде важко бачити, що будь-які пікселі відрізняються, навіть якщо ви дивитесь на 100% -ве збільшення! Налаштування камери та телефону смішно високі лише для того, щоб ви хотіли купувати нові телефони з більшим об’ємом пам’яті та більшими жорсткими дисками для своїх ПК… photo.stackexchange.com/questions/30243/…
McVitas

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 * -sampling-factor 4: 2: 0 -смужка -якість 88 -переміщення площини -define 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.