คำแนะนำสำหรับการบีบอัดไฟล์ JPG ด้วย ImageMagick


246

ฉันต้องการบีบอัดไฟล์ภาพ JPG ด้วย ImageMagick แต่มีขนาดแตกต่างกันไม่มาก ขนาดเอาต์พุตจะใหญ่กว่าอินพุต ฉันไม่รู้ว่าทำไม แต่หลังจากเพิ่มตัวเลือกโปรไฟล์ + และตั้งค่าคุณภาพฉันสามารถมีขนาดเล็กลง แต่ก็ยังคงคล้ายกับต้นฉบับ

ภาพอินพุต 255kb, ภาพที่ประมวลผลคือ 264kb (ใช้ + โปรไฟล์เพื่อลบโปรไฟล์และตั้งค่าคุณภาพเป็น 70%) มีวิธีใดในการบีบอัดภาพนั้นอย่างน้อย 150kb? เป็นไปได้ไหม ฉันสามารถใช้ตัวเลือก ImageMagick ใดได้บ้าง


3
การบีบอัด JPEG อีกครั้งจะส่งผลให้ภาพด้อยลงแม้ว่าจะมีขนาดใหญ่กว่าก็ตาม มันจะดีกว่าถ้าคุณสามารถเริ่มต้นด้วยต้นฉบับก่อนที่จะบันทึกในครั้งแรก
Mark Ransom

ฉันรู้ แต่น่าเสียดายที่ฉันไม่มีภาพต้นฉบับทั้งหมดที่ฉันมีคือไฟล์ jpg ขนาดใหญ่ แต่ฉันคิดว่าฉันสามารถสร้างความสมดุลระหว่างคุณภาพและขนาดที่ดี
Javis Perez

คำตอบ:


440

ฉันใช้เสมอ:

  • คุณภาพใน 85
  • ก้าวหน้า (บีบอัด comprobed)
  • gausssian เบลอขนาดเล็กมาก ๆ เพื่อปรับขนาด (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แทน สิ่งนี้จะลดความละเอียดของช่องสัญญาณ Chroma ลงเหลือเพียงครึ่งหนึ่งโดยไม่ต้องยุ่งกับความละเอียดของแสงที่ดวงตาของคุณมองเข้าไป หากคุณต้องการความเที่ยงตรงที่ดีกว่าในการแปลงคุณสามารถปรับปรุงได้เล็กน้อยโดยไม่ต้องเพิ่มขนาดไฟล์โดยการระบุ-define jpeg:dct-method=float- กล่าวคือใช้การแปลงโคไซน์ที่มีจุดลอยตัวที่แม่นยำยิ่งขึ้นแทนที่จะเป็นเวอร์ชันจำนวนเต็มเริ่มต้นที่รวดเร็ว


2
ขอบคุณ! รหัสนี้ทำให้ฉันมีภาพถึง 170kb ตอนนี้ฉันสามารถไปและทดสอบด้วยรหัสของคุณขอบคุณฉันยังได้พบตัวเลือก -define: scope = MAX_SIZE_IN_KB ที่ช่วยได้จริงๆขอบคุณ!
Javis Perez

36
mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpgหากคุณทำพวงของไฟล์ที่คุณยังสามารถทำ ตรวจสอบให้แน่ใจว่าคุณมีข้อมูลสำรองก่อนเรียกใช้คำสั่งนั้น มันจะเขียนในสถานที่
Richard Ayotte

3
-stripทำเพื่อฉัน ขอบคุณ
Nigel Angel

38
ฉันได้ภาพที่พร่ามัวมาก ดูเหมือนว่าจะต่อต้านการเบลอภาพโดยเจตนาเพื่อประหยัดพื้นที่ การใช้% คุณภาพต่ำกว่านี้จะไม่เหมาะสมกว่านี้หรือไม่ กระบวนการเปลี่ยนแปลงคุณภาพค่อนข้างดีในการประหยัดพื้นที่ในขณะที่รักษาคุณภาพของภาพที่ชัดเจน ฉันใส่เบียนเกาส์ 0.05 ลงบนภาพและช่วยประหยัดพื้นที่ แต่ดูเหมือนว่าไร้สาระที่สุด mogrify -strip -quality 75% *.jpgฉันตัดสินเกี่ยวกับการใช้ Strip ดีมาก 0 สูญเสียคุณภาพและประหยัดพื้นที่มาก และคุณภาพที่ 75% นั้นแทบจะไม่แตกต่างจาก 100% แต่ใช้พื้นที่เพียงครึ่งเดียว
Buttle Butkus

80
หากคุณไม่ชอบการเบลอให้ใช้ -sampling-factor 4: 2: 0 แทน สิ่งนี้จะลดความละเอียดของช่องสัญญาณ Chroma ลงเหลือเพียงครึ่งหนึ่งโดยไม่ต้องยุ่งกับความละเอียดของแสงที่ดวงตาของคุณมองเข้าไป หากคุณต้องการความคมชัดที่ดีขึ้นในการแปลงคุณสามารถได้รับการปรับปรุงเล็กน้อยโดยไม่ต้องเพิ่มขนาดไฟล์โดยการระบุ -define jpeg: dct-method = float - นั่นคือให้ใช้การแปลงโคไซน์แบบจุดต่อเนื่องที่แม่นยำยิ่งขึ้น รุ่นจำนวนเต็ม
Fordi

67

ฉันใช้แนวทางเพิ่มประสิทธิภาพภาพของ Google Pagespeed Insightsและสำหรับ ImageMagick พวกเขาแนะนำดังต่อไปนี้:

-sampling-factor 4: 2: 0
-strip -quality
85 [มันสามารถเปลี่ยนแปลงได้ฉันใช้ช่วง 60-80, จำนวนที่ต่ำกว่าที่นี่หมายถึงไฟล์ที่มีขนาดเล็กกว่า]
-interlace
-colorspace 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 kB
  • ความละเอียด: 3264x2448

คำสั่ง:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • ผลขนาดไฟล์ 753 kB
  • ความละเอียด 2048x2048

และฉันไม่เห็นการเปลี่ยนแปลงแบบเต็มหน้าจอด้วยความละเอียด 1920x1080 ของฉัน ความละเอียด 2048 เป็นสิ่งที่ดีที่สุดสำหรับการพัฒนาภาพถ่ายขนาด 10 ซม. ที่คุณภาพสูงสุด 360 dpi ฉันไม่ต้องการเปลื้องผ้า

แก้ไข: ฉันสังเกตเห็นว่าฉันได้รับผลลัพธ์ที่ดียิ่งขึ้นโดยไม่เบลอ ขนาดไฟล์ที่ไม่พร่ามัวคือ 50% ของต้นฉบับ แต่คุณภาพจะดีกว่า (เมื่อซูม)


คุณไม่ต้องเพิ่ม "-filter Lanczos" มันถูกกำหนดโดยค่าเริ่มต้นimagemagick.org/script/command-line-options.php#filter
Ilya Prokin

ดังที่ได้กล่าวไว้ข้างต้น - มันไม่มีประโยชน์ที่จะลดความละเอียดของภาพเพื่อทำให้ไฟล์เล็กลง ลดคุณภาพ JPEG แทน! คุณสามารถทดสอบด้วยตัวเอง - เปรียบเทียบสองภาพหนึ่งภาพที่มี JPEG 97% และอีกภาพหนึ่งถูกแปลงเป็นสมมติว่า 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 และเป็น Command Line (ฉันขอแนะนำให้ติดตั้งโดยใช้Brewแล้วค้นหาในสูตร Brew)


ฉันใช้pngquantสำหรับ Linux มันถูกอ้างอิงในหน้า ImageAlpha ขอบคุณสำหรับคำใบ้
Alexander Ryhlitsky

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,913KB
  • img_resized.jpg = 845KB

ฉันไม่แน่ใจว่าการแปลงนั้นทำลายภาพของฉันมากเกินไปหรือเปล่า แต่โดยสุจริตฉันไม่คิดว่าการแปลงของฉันจะดูเหมือนไร้สาระ มันเป็นภาพพาโนรามามุมกว้างและฉันไม่สนใจสิ่งกีดขวางที่พิถีพิถัน


5

@JavisPerez - มีวิธีการบีบอัดภาพที่ 150kb อย่างน้อย? เป็นไปได้ไหม ฉันสามารถใช้ตัวเลือก 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

มีบางคนทำการทดลองตัวเองที่นี่และเด็กผู้ชายทำหรือไม่ว่า Gausian blur สร้างความแตกต่างที่ดี คำสั่งสุดท้ายที่ฉันใช้คือ:

mogrify * - การสุ่มตัวอย่าง - ปัจจัย 4: 2: 0 -strip - quality 88 - ระนาบของเครื่องบิน - กำหนด jpeg: dct-method = float - colourspace RGB -gaussian-blur 0.05

หากไม่มี Gausian เบลอที่ 0.05 จะอยู่ที่ประมาณ 261kb โดยมีประมาณ 171KB สำหรับภาพที่ฉันทดสอบ ความแตกต่างของภาพบนจอภาพ 1440p ที่มีภาพซับซ้อนขนาดใหญ่จะไม่สังเกตเห็นได้จนกว่าคุณจะซูมเข้าทาง


โปรดทราบว่า Gaussian เบลอทำงานได้ไม่ดีกับภาพขนาดเล็ก แต่ต้องมีไว้สำหรับภาพขนาดใหญ่!
Antonin GAVREL

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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.