Rekomendasi untuk mengompresi file JPG dengan ImageMagick

246

Saya ingin mengompres file gambar JPG dengan ImageMagick tetapi tidak bisa mendapatkan banyak perbedaan ukuran. Secara default ukuran output lebih besar dari input. Saya tidak tahu mengapa, tetapi setelah menambahkan beberapa opsi profil + dan menurunkan kualitasnya saya bisa mendapatkan ukuran yang lebih kecil tetapi masih mirip dengan yang asli.

Gambar input adalah 255kb, gambar yang diproses adalah 264kb (menggunakan + profil untuk menghapus profil dan menetapkan kualitas hingga 70%). Apakah ada cara untuk mengompres gambar itu ke 150kb setidaknya? Apakah itu mungkin? Opsi ImageMagick apa yang dapat saya gunakan?

Javis Perez
sumber
3
Mengkompresi ulang suatu JPEG akan selalu menghasilkan gambar yang terdegradasi, bahkan jika itu lebih besar. Akan lebih baik jika Anda bisa mulai dengan yang asli sebelum disimpan pertama kali.
Mark Ransom
Saya tahu, tetapi sayangnya saya tidak memiliki gambar asli, semua yang saya miliki adalah file jpg besar, tapi saya pikir saya bisa mendapatkan keseimbangan yang baik antara kualitas dan ukuran
Javis Perez

Jawaban:

440

Saya selalu menggunakan:

  • kualitas dalam 85
  • progresif (kompresi terkompresi)
  • blur gausssian yang sangat kecil untuk mengoptimalkan ukuran (0,05 atau 0,5 radius) tergantung pada kualitas dan ukuran gambar, ini terutama mengoptimalkan ukuran jpeg.
  • Hapus komentar atau tag exif apa pun

dalam imagemagick seharusnya

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

atau dalam versi yang lebih baru:

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

semoga ini bermanfaat.

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

Dari @Fordi di komentar (jangan lupa jempol komentarnya jika Anda mau): Jika Anda tidak suka kabur, gunakan -sampling-factor 4:2:0saja. Apa yang dilakukan adalah mengurangi resolusi saluran chroma menjadi setengah, tanpa mengacaukan resolusi luminansi yang dipegang mata Anda. Jika Anda ingin kesetiaan yang lebih baik dalam konversi, Anda bisa mendapatkan sedikit peningkatan tanpa peningkatan filesize dengan menentukan -define jpeg:dct-method=float- yaitu, gunakan floating cosine transform floating point yang lebih akurat, daripada versi fast integer default.

Felipe Buccioni
sumber
2
Terima kasih! kode ini membuat saya gambar ke 170kb, sekarang saya bisa pergi dan bereksperimen dengan kode Anda terima kasih, juga saya telah menemukan opsi -define: Sejauh = MAX_SIZE_IN_KB yang benar-benar membantu, terima kasih!
Javis Perez
36
Jika Anda melakukan banyak file, Anda juga dapat melakukannya mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Pastikan Anda memiliki cadangan sebelum menjalankan perintah itu. Itu akan menulis di tempat.
Richard Ayotte
3
-stripmelakukannya untukku. Terima kasih
Nigel Angel
38
Saya mendapat gambar yang sangat buram. Tampaknya kontraproduktif dengan sengaja mengaburkan gambar untuk menghemat ruang. Bukankah lebih masuk akal untuk hanya menggunakan% kualitas yang lebih rendah? Proses perubahan kualitas cukup baik dalam menghemat ruang sambil mempertahankan kualitas gambar yang jelas. Saya menempatkan 0,05 gaussian blur pada gambar saya dan menghemat beberapa ruang tetapi tampak seperti omong kosong. Saya memutuskan untuk menggunakan mogrify -strip -quality 75% *.jpg. Strip bagus. 0 kehilangan kualitas, dan penghematan ruang yang besar. Dan kualitas pada 75% hampir tidak dapat dibedakan dari 100%, tetapi mengambil setengah ruang.
Buttle Butkus
80
Jika Anda tidak menyukai pengaburan, gunakan -sampling-factor 4: 2: 0 sebagai gantinya. Apa yang dilakukan adalah mengurangi resolusi saluran chroma menjadi setengah, tanpa mengacaukan resolusi luminansi yang dipegang mata Anda. Jika Anda menginginkan kesetiaan yang lebih baik dalam konversi, Anda bisa mendapatkan sedikit peningkatan tanpa peningkatan filesize dengan menentukan -define jpeg: dct-method = float - yaitu, gunakan floating point discrete cosine transform yang lebih akurat, daripada fast default versi integer.
Fordi
67

Saya menggunakan pedoman pengoptimalan gambar Google Pagespeed Insights , dan untuk ImageMagick mereka merekomendasikan yang berikut ini:

-sampling-factor 4: 2: 0
-strip -quality
85 [bisa bervariasi, saya menggunakan rentang 60-80, angka yang lebih rendah di sini berarti file yang lebih kecil]
-interlace
-colorspace RGB

Perintah di ImageMagick:

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

Dengan opsi ini saya mendapatkan penghematan hingga 40% dalam ukuran JPEG tanpa banyak kehilangan yang terlihat.

irina
sumber
16

Hanya untuk mereka yang menggunakan kelas Imagick di PHP:

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

sumber
14

Suatu kali saya perlu mengubah ukuran foto dari kamera untuk pengembangan:

  • Ukuran file asli: 2800 kB
  • Resolusi: 3264x2448

Perintah:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Hasil file berukuran 753 kB
  • Resolusi 2048x2048

dan saya tidak dapat melihat perubahan di layar penuh dengan monitor resolusi 1920x1080 saya. Resolusi 2048 adalah yang terbaik untuk mengembangkan foto 10 cm dengan kualitas maksimum 360 dpi. Saya tidak ingin menghapusnya.

sunting: Saya perhatikan bahwa saya bahkan mendapatkan hasil yang lebih baik tanpa mengaburkan. Tanpa memburamkan ukuran file adalah 50% asli, tetapi kualitasnya lebih baik (saat zooming).

tuipveus
sumber
Anda tidak perlu menambahkan "-filter Lanczos". Ini diatur oleh default imagemagick.org/script/command-line-options.php#filter
Ilya Prokin
seperti yang telah dikatakan di atas - tidak ada gunanya menurunkan resolusi gambar untuk membuat file lebih kecil. Turunkan kualitas JPEG! Anda dapat mengujinya sendiri - bandingkan dua gambar satu dengan 97% JPEG dan lainnya dikonversi menjadi katakanlah 68% dan Anda akan benar-benar kesulitan melihat piksel yang berbeda bahkan jika Anda melihat 100% zoom! Pengaturan stok kamera dan telepon sangat tinggi hanya untuk membuat Anda ingin membeli ponsel baru dengan penyimpanan yang lebih besar dan HDD yang lebih besar untuk PC Anda ... photo.stackexchange.com/questions/30243/…
McVitas
10

Saya akan menambahkan catatan tambahan yang berguna dan saran umum untuk meminimalkan JPG dan PNG.

Pertama-tama, ImageMagick membaca (atau lebih baik "tebak" ...) level kompresi input jpeg dan jadi jika Anda tidak menambahkan -quality NNsama sekali, output harus menggunakan level yang sama dengan input. Terkadang bisa menjadi fitur penting. Kalau tidak, level standarnya adalah -quality 92(lihat www.imagemagick.org )

Sarannya adalah tentang ImageOptim alat gratis yang benar-benar hebat , juga untuk proses batch.
Anda bisa mendapatkan jpg yang lebih kecil (dan png juga, terutama setelah penggunaan ImageAlpha gratis [bukan proses batch] atau Pngyu gratis jika Anda memerlukan proses batch).
Tidak hanya, alat-alat ini untuk Mac dan Menang dan sebagai Baris Perintah (saya sarankan menginstal menggunakan Brew dan kemudian mencari dalam formula Brew).

Steve
sumber
Saya menggunakan pngquant untuk Linux. Itu direferensikan pada halaman ImageAlpha. Terima kasih atas petunjuknya
Alexander Ryhlitsky
8

Saya menambahkan -adaptive-resize 60%ke perintah yang disarankan, tetapi dengan -quality 60%.

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

Ini adalah hasil saya

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

Saya tidak yakin apakah konversi itu merusak citra saya terlalu banyak, tetapi sejujurnya saya tidak berpikir konversi saya tampak seperti omong kosong. Itu adalah panorama sudut lebar dan saya tidak peduli dengan penghalang yang teliti.

C.shin
sumber
5

@ JovisPerez - Apakah ada cara untuk mengkompres gambar itu setidaknya 150kb? Apakah itu mungkin? Opsi ImageMagick apa yang dapat saya gunakan?

Lihat tautan berikut di mana ada opsi di ImageMagick untuk menentukan ukuran file output yang diinginkan untuk menulis ke file 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

Anda akan kehilangan beberapa kualitas dengan mendekompresi dan mengkompres ulang sebagai tambahan atas kerugian apa pun karena menurunkan nilai kualitas dari input.

fmw42
sumber
4

Apakah beberapa bereksperimen sendiri di sini dan anak laki-laki melakukan itu Gausian membuat perbedaan yang bagus. Perintah terakhir yang saya gunakan adalah:

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

Tanpa Gausian blur pada 0,05 itu sekitar 261kb, dengan itu sekitar 171KB untuk gambar yang saya uji. Perbedaan visual pada monitor 1440p dengan gambar kompleks besar tidak terlihat sampai Anda memperbesar jalan masuk.

Studio Ironbelly
sumber
Perhatikan bahwa Gaussian blur bekerja buruk dengan gambar kecil tetapi harus dimiliki untuk gambar besar!
Antonin GAVREL
4

Berikut solusi lengkap bagi mereka yang menggunakan Imagick di 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);
  }
}
emanuelbsilva
sumber
0

Jika gambar memiliki dimensi besar sulit untuk mendapatkan hasil yang baik tanpa mengubah ukuran, di bawah ini adalah ukuran 60 persen yang untuk sebagian besar tujuan tidak merusak terlalu banyak gambar.

Saya menggunakan ini dengan hasil yang baik untuk gambar skala abu-abu (saya konversi dari 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

Saya menggunakan ini untuk halaman B&W yang dipindai membuatnya menjadi gambar skala abu-abu (argumen tambahan membersihkan bayangan dari halaman sebelumnya):

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 

Saya menggunakan ini untuk gambar berwarna:

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
sumber