Zalecenie kompresji plików JPG za pomocą ImageMagick

Chcę skompresować plik obrazu JPG za pomocą ImageMagick, ale nie mogę uzyskać dużej różnicy w rozmiarze. Domyślnie rozmiar wyjściowy jest większy niż wejście. Nie wiem dlaczego, ale po dodaniu niektórych opcji profilu + i ustawieniu jakości mogę uzyskać mniejszy rozmiar, ale nadal podobny do oryginału.

Obraz wejściowy to 255kb, przetworzony obraz to 264kb (używając +profile do usuwania profili i ustawiając jakość na 70%). Czy da się skompresować Ten obraz przynajmniej do 150kb? Czy to możliwe? Jakich opcji ImageMagick mogę użyć?

Author: Andrew Lott, 2011-08-31

9 answers

Używam zawsze:

  • jakość w 85
  • progressive (kompresja)
  • bardzo małe Rozmycie gaussowskie w celu optymalizacji rozmiaru (0,05 lub 0,5 promienia) zależy od jakości i rozmiaru obrazu, co szczególnie optymalizuje rozmiar jpeg.
  • Usuń dowolny komentarz lub znacznik exif

W imagemagick powinno być

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% source.jpg result.jpg
Mam nadzieję, że się przyda.

Link źródłowy: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

Od @Fordi w komentarzach (nie zapomnij kciuka w jego komentarz, jeśli chcesz): Jeśli nie lubisz rozmycia, użyj -sampling-factor 4:2:0. Powoduje to zmniejszenie rozdzielczości kanału chroma do połowy, bez mieszania z rozdzielczością luminancji, którą przyciągają oczy. Jeśli chcesz uzyskać lepszą wierność konwersji, możesz uzyskać niewielką poprawę bez zwiększania rozmiaru pliku, podając -define jpeg:dct-method=float - to znaczy, użyj dokładniejszej zmiennoprzecinkowej dyskretnej transformacji cosinusowej, zamiast domyślnej szybkiej wersja integer.

 346
Author: Felipe Buccioni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-06 19:13:19

Używam Google Pagespeed Insights wytyczne optymalizacji obrazu, a dla ImageMagick zalecają:

- współczynnik próbkowania 4:2:0
- pasek
- jakość 85 [może się różnić, używam zakresu 60-80]
- przeplot
-colorspace RGB

Polecenie w ImageMagick:

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

Dzięki tym opcjom uzyskuję do 40% oszczędności w FORMACIE JPEG bez większych widocznych strat.

 23
Author: irina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 19:09:35

Tylko dla tych, którzy używają klasy Imagick w PHP:

$im -> gaussianBlurImage(0.8, 10);      //blur
$im -> setImageCompressionQuality(85);  //set compress quality to 85
 16
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 06:03:01

Kiedyś musiałem zmienić rozmiar zdjęć z aparatu do tworzenia:

  • oryginalny Rozmiar pliku: 2800 kB
  • rozdzielczość: 3264x2448

Polecenie:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Result filesize 753 kB
  • rozdzielczość 2048x2048

I nie widzę żadnych zmian w trybie pełnoekranowym z moim monitorem o Rozdzielczości 1920x1080. Rozdzielczość 2048 jest najlepsza do tworzenia zdjęć 10 cm przy maksymalnej jakości 360 dpi. Nie chcę go rozebrać.

Edit: zauważyłem, że nawet dostaję znacznie lepsze wyniki bez rozmycia. Bez rozmycia Rozmiar pliku jest 50% oryginału, ale jakość jest lepsza (przy powiększaniu).

 11
Author: tuipveus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 18:22:09

Dodałbym przydatną notatkę i ogólną sugestię, aby zminimalizować JPG i PNG.

Po pierwsze, ImageMagick czyta (lub lepiej "Zgadnij" ...) wejściowego poziomu kompresji jpeg, więc jeśli w ogóle nie dodasz -quality NN, wyjście powinno używać tego samego poziomu co wejście. Czasami może być ważną cechą. W przeciwnym razie domyślnym poziomem jest -quality 92 (Zobacz www.imagemagick.org )

Sugestia dotyczy naprawdę niesamowitego darmowego narzędzia ImageOptim, również dla procesu wsadowego.
Możesz uzyskać mniejsze pliki JPG (i PNG, szczególnie po użyciu wolnego ImageAlpha [nie proces wsadowy] lub wolnego Pngyu jeśli potrzebujesz procesu wsadowego).
Nie tylko, te narzędzia są dla Mac i Win i jako wiersz poleceń(sugeruję zainstalowanie za pomocą Brew, a następnie wyszukiwanie w formułach Brew).

 9
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-07 05:37:32

Dodałem -adaptive-resize 60% do sugerowanego polecenia, ale z -quality 60%.

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg

To były moje wyniki

  • img_original.jpg = 13 913 KB
  • img_resized.jpg = 845KB

Nie jestem pewien, czy ta konwersja za bardzo niszczy mój obraz, ale szczerze mówiąc nie sądziłem, że moja konwersja wygląda jak gówno. To była Panorama szerokokątna i nie dbałem o drobiazgową przeszkodę.

 5
Author: C.shin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 00:36:59

Oto kompletne rozwiązanie dla osób korzystających z Imagick w 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
Author: emanuelbsilva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 13:30:42

Czy trochę eksperymentować tutaj i boy robi, że Gausian rozmycie zrobić ładny inny. Ostatnią komendą, której użyłem było:

Mogrify * - sampling-factor 4:2: 0-strip-quality 88-interlace Plane-define jpeg:DCT-method=float-colorspace RGB-gaussian-blur 0.05

Bez rozmycia Gausiego przy 0.05 było to około 261kb, z nim było to około 171kb dla obrazu, na którym testowałem. Różnica wizualna na monitorze 1440p z dużym złożonym obrazem nie jest zauważalna, dopóki / align = "left" /

 2
Author: Ironbelly Studios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 12:02:00

@JavisPerez -- czy jest jakiś sposób, aby skompresować Ten obraz przynajmniej do 150KB? Czy to możliwe? Jakich opcji ImageMagick mogę użyć?

Zobacz następujące linki, gdzie istnieje opcja w ImageMagick, aby określić żądany rozmiar pliku wyjściowego do zapisu do plików 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

You will lose some jakość poprzez dekompresję i rekompresję oprócz wszelkich strat spowodowanych obniżeniem wartości jakości z wejścia.

 1
Author: fmw42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 01:42:52