Empfehlung zum Komprimieren von JPG-Dateien mit ImageMagick

246

Ich möchte eine JPG-Bilddatei mit ImageMagick komprimieren, kann aber keinen großen Größenunterschied feststellen. Standardmäßig ist die Ausgabegröße größer als die Eingabe. Ich weiß nicht warum, aber nachdem ich einige + Profiloptionen hinzugefügt und die Qualität festgelegt habe, kann ich eine kleinere Größe erhalten, die aber immer noch dem Original ähnelt.

Das Eingabebild ist 255 KB groß, das verarbeitete Bild ist 264 KB groß (mit + Profil werden Profile entfernt und die Qualität auf 70% eingestellt). Gibt es eine Möglichkeit, dieses Bild auf mindestens 150 KB zu komprimieren? Ist das möglich? Welche ImageMagick-Optionen kann ich verwenden?

Javis Perez
quelle
3
Das erneute Komprimieren eines JPEG führt immer zu einem verschlechterten Bild, auch wenn es größer ist. Es wäre besser, wenn Sie mit dem Original beginnen könnten, bevor es das erste Mal gespeichert wurde.
Mark Ransom
Ich weiß, aber leider habe ich nicht das Originalbild, alles was ich habe ist eine große JPG-Datei, aber ich denke, ich kann eine gute Balance zwischen Qualität und Größe bekommen
Javis Perez

Antworten:

440

Ich benutze immer:

  • Qualität in 85
  • progressive (komprimierte Komprimierung)
  • Eine sehr kleine Gausss'sche Unschärfe zur Optimierung der Größe (0,05 oder 0,5 des Radius) hängt von der Qualität und Größe des Bildes ab. Dies optimiert insbesondere die Größe des JPEGs.
  • Entfernen Sie alle Kommentare oder Exif-Tags

in imagemagick sollte sein

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

oder in der neueren Version:

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

hoffe das ist nützlich.

Quelllink: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

Von @Fordi in den Kommentaren (vergessen Sie nicht, seinen Kommentar hochzublättern, wenn Sie möchten): Wenn Sie Unschärfe nicht mögen, verwenden Sie -sampling-factor 4:2:0stattdessen. Dadurch wird die Auflösung des Chroma-Kanals auf die Hälfte reduziert, ohne die Luminanzauflösung zu beeinträchtigen, an der Ihre Augen festhalten. Wenn Sie eine bessere Wiedergabetreue bei der Konvertierung wünschen, können Sie durch Angabe eine geringfügige Verbesserung erzielen, ohne die Dateigröße zu erhöhen. -define jpeg:dct-method=floatVerwenden Sie daher die genauere diskrete Gleitkomma-Cosinustransformation anstelle der Standardversion für schnelle Ganzzahlen.

Felipe Buccioni
quelle
2
Danke dir! Dieser Code hat mir das Bild auf 170 KB gebracht. Jetzt kann ich mit Ihrem Code experimentieren. Danke. Außerdem habe ich die Option -define: Extent = MAX_SIZE_IN_KB gefunden, die wirklich hilft. Danke!
Javis Perez
36
Wenn Sie eine Reihe von Dateien erstellen, können Sie dies auch tun mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Stellen Sie sicher, dass Sie ein Backup haben, bevor Sie diesen Befehl ausführen. Es wird an Ort und Stelle schreiben.
Richard Ayotte
3
-striphabe es für mich getan. Danke
Nigel Angel
38
Ich habe sehr verschwommene Bilder. Es erscheint kontraproduktiv, das Bild absichtlich zu verwischen, um Platz zu sparen. Wäre es nicht sinnvoller, nur eine niedrigere Qualität zu verwenden? Der Prozess der Qualitätsänderung ist ziemlich gut darin, Platz zu sparen und gleichzeitig die scheinbare Bildqualität beizubehalten. Ich habe meinem Bild eine Gaußsche Unschärfe von 0,05 hinzugefügt, die etwas Platz gespart hat, aber wie völliger Mist aussah. Ich entschied mich für die Verwendung mogrify -strip -quality 75% *.jpg. Strip ist großartig. 0 Qualitätsverlust und große Platzersparnis. Und Qualität bei 75% ist kaum von 100% zu unterscheiden, nimmt aber die Hälfte des Platzes ein.
Buttle Butkus
80
Wenn Sie Unschärfe nicht mögen, verwenden Sie stattdessen -sampling-factor 4: 2: 0. Dadurch wird die Auflösung des Chroma-Kanals auf die Hälfte reduziert, ohne die Luminanzauflösung zu beeinträchtigen, an der Ihre Augen festhalten. Wenn Sie eine bessere Wiedergabetreue bei der Konvertierung wünschen, können Sie eine leichte Verbesserung erzielen, ohne die Dateigröße zu erhöhen, indem Sie -define jpeg: dct-method = float angeben. Verwenden Sie also die genauere diskrete Gleitkomma-Cosinus-Transformation anstelle der Standard-Fast Ganzzahlige Version.
Fordi
67

Ich verwende die Bildoptimierungsrichtlinien von Google Pagespeed Insights und für ImageMagick empfehlen sie Folgendes:

-sampling-factor 4: 2: 0
-strip -quality
85 [es kann variieren, ich verwende den Bereich 60-80, niedrigere Zahl bedeutet hier kleinere Datei]
-interlace
-colorspace RGB

Befehl in ImageMagick:

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

Mit diesen Optionen kann ich bis zu 40% der JPEG-Größe ohne großen sichtbaren Verlust einsparen.

Irina
quelle
16

Nur für diejenigen, die die Imagick-Klasse in PHP verwenden:

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

quelle
14

Einmal musste ich die Größe der Fotos von der Kamera für die Entwicklung ändern:

  • Ursprüngliche Dateigröße: 2800 kB
  • Auflösung: 3264 x 2448

Befehl:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Ergebnis Dateigröße 753 kB
  • Auflösung 2048x2048

und ich kann mit meinem Monitor mit einer Auflösung von 1920 x 1080 keine Änderungen im Vollbildmodus sehen. Die Auflösung von 2048 eignet sich am besten für die Entwicklung von 10-cm-Fotos bei einer maximalen Qualität von 360 dpi. Ich will es nicht ausziehen.

edit: Mir ist aufgefallen, dass ich sogar viel bessere Ergebnisse bekomme, ohne zu verwischen. Ohne Unschärfe beträgt die Dateigröße 50% des Originals, aber die Qualität ist besser (beim Zoomen).

Tuipveus
quelle
Sie müssen nicht "-filter Lanczos" hinzufügen. Es ist standardmäßig imagemagick.org/script/command-line-options.php#filter
Ilya Prokin
Wie oben erwähnt, ist es sinnlos, die Bildauflösung zu verringern, um die Datei zu verkleinern. Verringern Sie stattdessen die JPEG-Qualität! Sie können es selbst testen - vergleichen Sie zwei Bilder, eines mit 97% JPEG und eines, das auf 68% konvertiert wurde, und Sie werden es wirklich schwer haben, Pixel anders zu sehen, selbst wenn Sie 100% Zoom betrachten! Die Einstellungen für Standardkameras
McVitas
10

Ich würde eine nützliche Randnotiz und einen allgemeinen Vorschlag hinzufügen, um JPG und PNG zu minimieren.

Zunächst liest ImageMagick die JPEG-Komprimierungsstufe der Eingabe (oder besser "erraten" ...). Wenn Sie also überhaupt nichts hinzufügen -quality NN, sollte die Ausgabe dieselbe Stufe wie die Eingabe verwenden. Manchmal könnte ein wichtiges Merkmal sein. Andernfalls ist die Standardstufe -quality 92(siehe www.imagemagick.org ).

Der Vorschlag handelt von einem wirklich großartigen kostenlosen Tool ImageOptim , auch für den Batch-Prozess.
Sie können kleinere JPGs (und auch PNGs, insbesondere nach Verwendung des kostenlosen ImageAlpha [kein Batch-Prozess] oder des kostenlosen Pngyu, wenn Sie einen Batch-Prozess benötigen) erhalten.
Diese Tools sind nicht nur für Mac und Win sowie als Befehlszeile vorgesehen (ich empfehle, sie mit Brew zu installieren und dann in Brew-Formeln zu suchen).

Steve
quelle
Ich habe pngquant für Linux verwendet. Es wurde auf der ImageAlpha-Seite referenziert. Danke für den Hinweis
Alexander Ryhlitsky
8

Ich -adaptive-resize 60%habe dem vorgeschlagenen Befehl hinzugefügt , aber mit -quality 60%.

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

Das waren meine Ergebnisse

  • img_original.jpg = 13.913 KB
  • img_resized.jpg = 845 KB

Ich bin mir nicht sicher, ob diese Konvertierung mein Image zu sehr zerstört, aber ich habe ehrlich gesagt nicht gedacht, dass meine Konvertierung wie Mist aussieht. Es war ein Weitwinkelpanorama und ich kümmerte mich nicht um akribische Hindernisse.

C. shin
quelle
5

@JavisPerez - Gibt es eine Möglichkeit, dieses Bild auf mindestens 150 KB zu komprimieren? Ist das möglich? Welche ImageMagick-Optionen kann ich verwenden?

Unter den folgenden Links finden Sie eine Option in ImageMagick, mit der Sie die gewünschte Größe der Ausgabedatei zum Schreiben in JPG-Dateien festlegen können.

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

Sie verlieren etwas an Qualität, indem Sie zusätzlich zu einem Verlust aufgrund einer Verringerung des Qualitätswerts von der Eingabe dekomprimieren und erneut komprimieren.

fmw42
quelle
4

Habe hier selbst experimentiert und Junge macht diese gausische Unschärfe einen schönen Unterschied. Der letzte Befehl, den ich benutzte, war:

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

Ohne die Gausianische Unschärfe bei 0,05 waren es ungefähr 261 KB, bei dem Bild, auf dem ich getestet habe, waren es ungefähr 171 KB. Der visuelle Unterschied auf einem 1440p-Monitor mit einem großen komplexen Bild macht sich erst bemerkbar, wenn Sie ganz hineinzoomen.

Ironbelly Studios
quelle
Beachten Sie, dass die Gaußsche Unschärfe bei kleinen Bildern schlecht funktioniert, bei großen jedoch ein Muss ist!
Antonin GAVREL
4

Hier ist eine Komplettlösung für diejenigen, die Imagick in PHP verwenden:

$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);
  }
}
emanuelbsilva
quelle
0

Wenn das Bild große Dimensionen aufweist, ist es schwierig, ohne Größenänderung gute Ergebnisse zu erzielen. Im Folgenden finden Sie eine Größenänderung von 60 Prozent, die für die meisten Zwecke nicht zu viel Bild zerstört.

Ich verwende dies mit gutem Ergebnis für Graustufenbilder (ich konvertiere aus 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

Ich verwende dies für gescannte Schwarzweißseiten, um sie zu Graustufenbildern zu bringen (die zusätzlichen Argumente bereinigen Schatten von vorherigen Seiten):

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 

Ich benutze dies für Farbbilder:

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 
Eduard Florinescu
quelle