เพียงเพื่อตรวจสอบให้ฉันทดสอบการวิเคราะห์ของ ForeverWintrทดลอง
ภาพอินพุตที่เลวร้ายที่สุดสำหรับการบีบอัด JPEG (หรือการบีบอัดใด ๆจริง ๆ ) เป็นสัญญาณรบกวน RGB แบบสุ่มอย่างสม่ำเสมอซึ่งไม่สามารถบีบอัดได้ในทางทฤษฎี ดังนั้นให้ฉันสร้างบางอย่างโดยใช้เครื่องมือnetpbm :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(สัญญาณรบกวน RGB สุ่มสม่ำเสมอ, รูปแบบ PNG แบบไม่สูญเสีย, 903 kb)
หมายเหตุ (มีนาคม 2017): ฉันค่อนข้างแน่ใจว่าภาพด้านบนอยู่ในรูปแบบ PNG เมื่อฉันเขียนคำตอบนี้เป็นครั้งแรกและอัปโหลดกลับในปี 2013 (แม้จะมีความคิดเห็นเกี่ยวกับการจัดการสีด้านล่างซึ่งมีความหมายอย่างยิ่ง) ดูเหมือนว่ามันถูกแปลงเป็น JPEG ในบางครั้งทำให้การเปรียบเทียบภาพที่นี่ไร้ประโยชน์
ฉันพยายามที่จะอัปโหลดภาพทดสอบ PNG ใหม่ แต่เห็นได้ชัดว่ามันกระทบขีด จำกัด ขนาดไฟล์ PNG โดยพลการที่ imgur และแปลงเป็น JPEG โดยอัตโนมัติ ฉันไม่แน่ใจว่ามีวิธีแก้ไขปัญหานี้หรือไม่ แต่อย่างน้อยถ้าคุณมีกล่องลีนุกซ์คุณสามารถเรียกใช้คำสั่งที่ให้ไว้อีกครั้งเพื่อสร้างภาพทดสอบของคุณเอง ไม่ว่าในกรณีใดนอกเหนือจากการป้องกันการเปรียบเทียบคุณภาพโดยตรงของการบีบอัดด้วยสายตาโดยตรงนี่ไม่ได้ทำให้การวิเคราะห์ด้านล่างเป็นไปอย่างผิดเพี้ยน
ตกลงดังนั้นไฟล์ PPM ที่ไม่บีบอัดจึงมีความยาว 640 × 480 × 3 = 921,600 ไบต์ยาวบวก 15 ไบต์สำหรับส่วนหัว PPM ขั้นต่ำตามที่คาดไว้ การพยายามบีบอัดแบบไม่สูญเสียข้อมูลโดยใช้รูปแบบ PNG เพียงแค่เพิ่มขนาดโดย 2157 ไบต์อาจใช้ส่วนหัวและข้อมูลเมตาของ PNG และอาจมีประสิทธิภาพเล็กน้อยในอัลกอริทึมการบีบอัดที่พยายามบีบอัดข้อมูลที่บีบอัดไม่ได้
(ใช่นั่นคือ 3 ไบต์ต่อพิกเซลไม่ใช่ 4 แม้แต่รูปแบบ PPM ซึ่งเป็นเรื่องง่ายเหมือนรูปแบบไฟล์กราฟิกสามารถรับได้ไม่โง่พอที่จะเก็บไบต์ที่สี่ที่ไร้ประโยชน์ต่อพิกเซลบนดิสก์อาจมีบางอย่าง ข้อดีในการทำเช่นนั้นในหน่วยความจำสำหรับเหตุผลการจัดตำแหน่งโดยเฉพาะอย่างยิ่งถ้าคุณจำเป็นต้องจัดเก็บช่องอัลฟา แต่ด้วยเหตุผลเหล่านั้นไม่ได้นำไปใช้เมื่อเขียนภาพไปยังไฟล์)
ตกลงดังนั้นแล้ว JPEG ล่ะ ลองลดการสูญเสียการบีบอัดให้สั้นที่สุดก่อน (คุณภาพ = 100, ไม่มีการสุ่มสี Chroma, DCT แบบลอยตัว) น่าเสียดายที่pnmtojpeg
คู่มือไม่ได้อธิบายอย่างชัดเจนถึงวิธีการตั้งค่าตัวเลือกที่เกี่ยวข้องทั้งหมด (โดยเฉพาะอย่างยิ่ง-sample
ตัวเลือกมีการระบุไว้ในส่วน "ตัวเลือกสำหรับพ่อมด" ซึ่งเพิ่งอ้างอิงไฟล์ในเอกสารประกอบ libjpeg) ดังนั้นฉันจะแปลงเป็น GIMP แทน ไฟล์ผลลัพธ์มีลักษณะดังนี้:
897249 rnd.jpg
(เสียงรบกวน RGB ที่ถูกบีบอัด JPEG, คุณภาพ = 100, ไม่มีการสุ่มสี Chroma, 876 kb)
อะไรมันจะเล็กลงได้อย่างไร ฉันไม่ได้แค่พูดว่าเสียงที่บริสุทธิ์นั้นไม่มีความกดดันหรือ? ดีสิ่งที่เป็นแม้ในที่มีคุณภาพสูงสุด, บีบอัดไฟล์ JPEG ปกติไม่ได้ค่อนข้าง lossless การเปิดภาพอีกครั้งใน GIMP และเปรียบเทียบกับภาพต้นฉบับจะเห็นว่าบางพิกเซลมีค่าสีที่ถูกเลื่อนไปหนึ่งหรือสองขั้นตอน (จาก 256) นั่นคือพิกเซลที่อัลกอริธึมการบีบอัด JPEG "โกง" และโยนทิ้งไปอีกเล็กน้อยที่นี่ซึ่งคาดว่าการเปลี่ยนแปลงนั้นจะไม่สามารถสังเกตเห็นได้ อันที่จริงแล้วสำหรับสายตามนุษย์ที่ไม่ได้พูดถึงผลที่ได้นั้นค่อนข้างแตกต่างจากต้นฉบับ แต่บิตที่ถูกทิ้งเหล่านั้นจะเพิ่มขนาดไฟล์ที่ลดลงซึ่งวัดได้แม้หลังจากการบัญชีสำหรับส่วนหัวและการเข้ารหัสเหนือศีรษะ
นั่นคือคุณภาพสูงสุด สิ่งที่เกี่ยวกับการตั้งค่าทั่วไปเพิ่มเติมเช่นpnmtojpeg
ค่าเริ่มต้น (คุณภาพ = 75 เปิดใช้งานการสุ่มตัวอย่าง) มาลองดูกัน:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(เสียงรบกวน RGB ที่ถูกบีบอัด JPEG, คุณภาพ = 75, การยกตัวอย่างสี, 184 kb)
ว้าวจาก 901 เหลือ 184 kb! เป็นการบีบอัดที่ค่อนข้างก้าวร้าวและคุณสามารถบอกความแตกต่างได้อย่างแน่นอนเมื่อเปรียบเทียบภาพอย่างใกล้ชิด ส่วนใหญ่เป็นเพราะการย่อยตัวอย่างของ Chroma ซึ่งโดยทั่วไปจะทิ้งข้อมูล 75% ของสี (สี / ความอิ่มตัว) การลองใน GIMP ด้วยการปิดการใช้งานการสุ่มตัวอย่างจะให้ไฟล์ 350,618 ไบต์ที่ยังคงมีลักษณะ (ในสายตามนุษย์อย่างน้อย) สวยใกล้เคียงกับต้นฉบับแม้จะขยาย
อย่างไรก็ตามจุดทั้งหมดนี้คือการแสดงให้เห็นว่าไม่ว่าภาพท้องฟ้ายามค่ำคืนที่มีเสียงดังของคุณอาจจะเป็นและว่าวิธีการที่มีคุณภาพสูงที่คุณอาจเลือกไม่ได้มีเพียงวิธีที่ไม่มีไฟล์ 640 × 480 JPEG สามารถได้รับอย่างมีนัยสำคัญมีขนาดใหญ่กว่า 900 กิโล (ยกเว้นว่ากล้องของคุณจะแนบโพรไฟล์สี Exif หลายเมกะไบต์หรืออะไรที่โง่พอ ๆ กันนั่นก็คือ) และถ้าคุณใช้การตั้งค่าการบีบอัด JPEG ทั่วไปขนาดไฟล์ที่เป็นไปได้สูงสุดจะลดลงประมาณ 200 kb หรือมากกว่านั้น .