Đề xuất nén tệp JPG bằng ImageMagick


246

Tôi muốn nén tệp hình ảnh JPG bằng ImageMagick nhưng không thể có nhiều sự khác biệt về kích thước. Theo mặc định, kích thước đầu ra lớn hơn đầu vào. Tôi không biết tại sao, nhưng sau khi thêm một số tùy chọn + hồ sơ và thiết lập chất lượng, tôi có thể có kích thước nhỏ hơn nhưng vẫn tương tự như bản gốc.

Hình ảnh đầu vào là 255kb, hình ảnh được xử lý là 264kb (sử dụng + profile để xóa cấu hình và đặt chất lượng thành 70%). Có cách nào để nén hình ảnh đó xuống 150kb ít nhất không? Điều đó có thể không? Tôi có thể sử dụng tùy chọn ImageMagick nào?


3
Việc giải nén JPEG sẽ luôn dẫn đến hình ảnh bị suy giảm, ngay cả khi nó lớn hơn. Sẽ tốt hơn nếu bạn có thể bắt đầu với bản gốc trước khi nó được lưu lần đầu tiên.
Đánh dấu tiền chuộc

Tôi biết, nhưng tiếc là tôi không có hình ảnh gốc, tất cả những gì tôi có là một tệp jpg lớn, nhưng tôi nghĩ rằng tôi có thể có được sự cân bằng tốt giữa chất lượng và kích thước
Javis Perez

Câu trả lời:


440

Tôi sử dụng luôn:

  • chất lượng trong 85
  • lũy tiến (nén nén)
  • một độ mờ gausssian rất nhỏ để tối ưu hóa kích thước (0,05 hoặc 0,5 bán kính) phụ thuộc vào chất lượng và kích thước của hình ảnh, điều này đáng chú ý là tối ưu hóa kích thước của jpeg.
  • Tách bất kỳ thẻ nhận xét hoặc thẻ exif

trong tưởng tượng nên

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

hoặc trong phiên bản mới hơn:

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

hy vọng điều này sẽ hữu ích.

Liên kết nguồn: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

Từ @Fordi trong các bình luận (đừng quên đưa ra nhận xét của anh ấy nếu bạn thích): Nếu bạn không thích làm mờ, -sampling-factor 4:2:0thay vào đó hãy sử dụng . Điều này làm là giảm độ phân giải của kênh sắc độ xuống còn một nửa, mà không làm rối loạn độ phân giải độ chói mà mắt bạn bám vào. Nếu bạn muốn độ trung thực tốt hơn trong chuyển đổi, bạn có thể cải thiện một chút mà không cần tăng kích thước tệp bằng cách chỉ định -define jpeg:dct-method=float- nghĩa là sử dụng biến đổi cosine rời rạc điểm chính xác hơn, thay vì phiên bản số nguyên nhanh mặc định.


2
Cảm ơn bạn! mã này đã đưa tôi hình ảnh lên 170kb, bây giờ tôi có thể đi và thử nghiệm mã của bạn cảm ơn bạn, tôi cũng đã tìm thấy tùy chọn -define: scope = MAX_SIZE_IN_KB thực sự hữu ích, cảm ơn bạn!
Javis Perez

36
Nếu bạn đang làm một loạt các tập tin, bạn cũng có thể làm mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Hãy chắc chắn rằng bạn có một bản sao lưu trước khi chạy lệnh đó. Nó sẽ viết tại chỗ.
Richard Ayotte

3
-stripđã làm điều đó cho tôi. Cảm ơn
Nigel Angel

38
Tôi nhận được hình ảnh rất mờ. Có vẻ như phản tác dụng khi cố tình làm mờ hình ảnh để tiết kiệm không gian. Sẽ không có ý nghĩa hơn nếu chỉ sử dụng% chất lượng thấp hơn? Quá trình thay đổi chất lượng là khá tốt trong việc tiết kiệm không gian trong khi vẫn duy trì chất lượng hình ảnh rõ ràng. Tôi đặt một vệt mờ 0,05 gaussian trên hình ảnh của mình và nó đã tiết kiệm một số không gian nhưng trông giống như hoàn toàn tào lao. Tôi quyết định sử dụng mogrify -strip -quality 75% *.jpg. Dải là tuyệt vời. Mất chất lượng 0, và tiết kiệm không gian lớn. Và chất lượng ở mức 75% hầu như không thể phân biệt được với 100%, nhưng chiếm một nửa không gian.
Butussy Butkus

80
Nếu bạn không thích làm mờ, thay vào đó, hãy sử dụng -sampling-Fact 4: 2: 0. Điều này làm là giảm độ phân giải của kênh sắc độ xuống còn một nửa, mà không làm rối loạn độ phân giải độ chói mà mắt bạn bám vào. Nếu bạn muốn độ trung thực tốt hơn trong chuyển đổi, bạn có thể cải thiện một chút mà không tăng kích thước tệp bằng cách chỉ định -define jpeg: dct-method = float - nghĩa là sử dụng biến đổi cosine rời rạc chính xác hơn, thay vì nhanh mặc định phiên bản số nguyên.
Fordi

67

Tôi đang sử dụng các nguyên tắc tối ưu hóa hình ảnh của Google Pagespeed Insights và đối với ImageMagick, họ khuyên bạn nên như sau:

-sampling-Fact 4: 2: 0
-strip -quality
85 [nó có thể thay đổi, tôi sử dụng phạm vi 60-80, số thấp hơn ở đây có nghĩa là tệp nhỏ hơn]
-interlace
-colorspace RGB

Lệnh trong ImageMagick:

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

Với các tùy chọn này, tôi có thể tiết kiệm tới 40% kích thước JPEG mà không bị mất nhiều.


16

Chỉ cần nói cho những người sử dụng lớp Imagick trong PHP:

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

14

Khi tôi cần thay đổi kích thước ảnh từ máy ảnh để phát triển:

  • Kích thước tệp gốc: 2800 kB
  • Độ phân giải: 3264x2448

Chỉ huy:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Kết quả tập tin kích thước 753 kB
  • Nghị quyết 2048x2048

và tôi không thể thấy bất kỳ thay đổi nào trên toàn màn hình với màn hình độ phân giải 1920x1080 của mình. Độ phân giải 2048 là tốt nhất để phát triển ảnh 10 cm với chất lượng tối đa 360 dpi. Tôi không muốn tước nó.

chỉnh sửa: Tôi nhận thấy rằng tôi thậm chí nhận được kết quả tốt hơn nhiều mà không bị mờ. Không làm mờ kích thước tập tin là 50% so với bản gốc, nhưng chất lượng tốt hơn (khi thu phóng).


Bạn không cần phải thêm "-filter Lanczos". Đó là thiết lập theo mặc định imagemagick.org/script/command-line-options.php#filter
Ilya Prokin

như đã nói ở trên - thật vô ích khi hạ thấp độ phân giải hình ảnh để làm cho tệp nhỏ hơn. Thay vào đó, giảm chất lượng JPEG! Bạn có thể tự kiểm tra - so sánh hai hình ảnh một với 97% JPEG và một hình ảnh khác được chuyển đổi thành 68% và bạn sẽ thực sự gặp khó khăn khi thấy bất kỳ pixel nào khác nhau ngay cả khi bạn nhìn vào zoom 100%! Cài đặt máy ảnh và điện thoại cao vô lý chỉ để khiến bạn muốn mua điện thoại mới có dung lượng lớn hơn và ổ cứng lớn hơn cho PC của bạn ... photo.stackexchange.com/questions/30243/ Thẻ
McVitas

10

Tôi sẽ thêm một ghi chú bên hữu ích và một gợi ý chung để giảm thiểu JPG và PNG.

Trước hết, ImageMagick đọc (hoặc "đoán" tốt hơn ...) mức nén jpeg đầu vào và vì vậy nếu bạn không thêm -quality NNvào, đầu ra sẽ sử dụng cùng mức với đầu vào. Đôi khi có thể là một tính năng quan trọng. Mặt khác, mức mặc định là -quality 92(xem www.imagemagick.org )

Gợi ý là về một công cụ miễn phí thực sự tuyệt vời ImageOptim , cũng cho quy trình hàng loạt.
Bạn có thể nhận được các jpg nhỏ hơn (và pngs, đặc biệt là sau khi sử dụng ImageAlpha miễn phí [không phải quy trình theo đợt] hoặc Pngyu miễn phí nếu bạn cần quy trình theo đợt).
Không chỉ vậy, các công cụ này dành cho Mac và Win và dưới dạng Dòng lệnh (Tôi khuyên bạn nên cài đặt bằng cách sử dụng Brew và sau đó tìm kiếm trong công thức Brew).


Tôi đã sử dụng pngquant cho Linux. Nó được tham chiếu trên trang ImageAlpha. Cảm ơn gợi ý
Alexander Ryhlitsky

8

Tôi đã thêm vào -adaptive-resize 60%lệnh được đề xuất, nhưng với -quality 60%.

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

Đây là kết quả của tôi

  • img_origen.jpg = 13,913KB
  • img_resized.jpg = 845KB

Tôi không chắc liệu chuyển đổi đó có phá hủy hình ảnh của tôi quá nhiều hay không, nhưng thực lòng tôi không nghĩ rằng chuyển đổi của mình trông giống như tào lao. Đó là một bức tranh toàn cảnh góc rộng và tôi không quan tâm đến sự tắc nghẽn tỉ mỉ.


5

@JavisPerez - Có cách nào để nén hình ảnh đó xuống 150kb ít nhất không? Điều đó có thể không? Tôi có thể sử dụng tùy chọn ImageMagick nào?

Xem các liên kết sau có tùy chọn trong ImageMagick để chỉ định kích thước tệp đầu ra mong muốn để ghi vào tệp 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

Bạn sẽ mất một số chất lượng bằng cách giải nén và giải nén ngoài bất kỳ tổn thất nào do giảm giá trị chất lượng từ đầu vào.


4

Có một số thử nghiệm bản thân mình ở đây và cậu bé làm điều đó Gausian làm cho một sự khác biệt tốt đẹp. Lệnh cuối cùng tôi sử dụng là:

mogrify * -sampling-Fact 4: 2: 0 -strip -quality 88 -interlace Plane -define jpeg: dct-method = float -colorspace RGB -gaussian-Blur 0,05

Không có độ mờ Gausian ở mức 0,05, nó là khoảng 261kb, với nó là khoảng 171KB cho hình ảnh tôi đang thử nghiệm. Sự khác biệt về hình ảnh trên màn hình 1440p với hình ảnh phức tạp lớn là không đáng chú ý cho đến khi bạn phóng to theo cách.


Lưu ý rằng mờ Gaussian hoạt động kém với các hình ảnh nhỏ nhưng phải có cho những hình ảnh lớn!
Antonin GAVREL

4

Đây là một giải pháp hoàn chỉnh cho những người sử dụng Imagick trong 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

Nếu hình ảnh có độ mờ lớn khó có được kết quả tốt mà không thay đổi kích thước, bên dưới là thay đổi kích thước 60 phần trăm mà hầu hết các mục đích không phá hủy quá nhiều hình ảnh.

Tôi sử dụng điều này với kết quả tốt cho hình ảnh tỷ lệ xám (tôi chuyển đổi từ 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

Tôi sử dụng điều này cho các trang B & W được quét để đưa chúng vào hình ảnh tỷ lệ xám (các đối số bổ sung làm sạch bóng từ các trang trước):

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 

Tôi sử dụng điều này cho hình ảnh màu:

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.