PNG ไม่สูญเสียข้อมูลอย่างไรเนื่องจากมีพารามิเตอร์การบีบอัด


156

มีการกล่าวว่าไฟล์ PNG ใช้การบีบอัดแบบไม่สูญเสียข้อมูล อย่างไรก็ตามเมื่อใดก็ตามที่ฉันอยู่ในโปรแกรมแก้ไขภาพเช่นGIMPและพยายามบันทึกภาพเป็นไฟล์ PNG มันจะถามพารามิเตอร์การบีบอัดซึ่งอยู่ในช่วงระหว่าง 0 ถึง 9 หากมีพารามิเตอร์การบีบอัดที่มีผลต่อความแม่นยำของภาพ รูปภาพที่ถูกบีบอัดจะทำให้ PNG หายไปได้อย่างไร

ฉันจะได้รับพฤติกรรมแบบไม่สูญเสียเมื่อฉันตั้งค่าพารามิเตอร์การบีบอัดเป็น 9 หรือไม่


40
อัลกอริธึมการบีบอัดแบบไม่สูญเสียข้อมูลส่วนใหญ่มีการปรับค่าได้ (เช่นขนาดพจนานุกรม) ซึ่งได้รับการสรุปโดยทั่วไปในแถบเลื่อน ใช้ได้กับ ZIP, GZip, BZip2, LZMA, ...
Daniel B

20
คำถามอาจถูกระบุแตกต่างกัน หากไม่มีการสูญเสียคุณภาพจากการบีบอัดทำไมไม่ใช้การบีบอัดที่สร้างขนาดที่เล็กที่สุดเสมอไป? คำตอบก็คงจะเป็นเพราะมันต้องใช้แรมมากขึ้นและเวลา CPU มากขึ้นในการบีบอัดและคลายการบีบอัด บางครั้งคุณต้องการบีบอัดที่เร็วขึ้นและไม่สนใจอัตราส่วนการบีบอัดมากนัก
kasperd

14
การบีบอัด PNG เกือบจะเหมือนกับไฟล์ ZIPping คุณสามารถบีบอัดไฟล์เหล่านี้ได้มากกว่าหรือน้อยกว่า แต่คุณจะได้รับไฟล์ที่แน่นอนกลับมาเมื่อมันขยายขนาดออก - นั่นคือสิ่งที่ทำให้มันไม่มีความสูญเสีย
mikebabcock

13
ซอฟต์แวร์บีบอัดส่วนใหญ่เช่น Zip และ Rar อนุญาตให้คุณป้อน "ระดับการบีบอัด" ซึ่งอนุญาตให้คุณเลือกระหว่างไฟล์ขนาดเล็ก <--> เวลาที่สั้นลง ไม่ได้หมายความว่าซอฟต์แวร์เหล่านี้จะทิ้งข้อมูลในระหว่างการบีบอัด การตั้งค่านี้ (ใน GIMP, pngcrush ฯลฯ ) จะคล้ายกัน
Salman

2
@naxa: ไม่มีข้อแม้ว่า png แบบไม่สูญเสียมันเป็นอย่างไร ไม่สูญเสีย 100% เสมอ บทความนี้จะเตือนคุณเกี่ยวกับข้อบกพร่องที่เบราว์เซอร์เก่าบางรุ่นมีในการนำ PNG ไปใช้เพื่อจัดการการแก้ไขแกมม่า และนั่นก็มีความหมายเฉพาะถ้าคุณต้องการจับคู่สีกับสี CSS (ซึ่งไม่ได้แก้ไขแกมม่า)
Pauli L

คำตอบ:


183

PNG ไม่มีความสูญเสีย คนพิการน่าจะไม่ได้ใช้คำที่ดีที่สุดในกรณีนี้ คิดว่าเป็น "คุณภาพการบีบอัด" หรือกล่าวอีกนัยหนึ่ง "ระดับการบีบอัด" ด้วยการบีบอัดที่ต่ำกว่าคุณจะได้ไฟล์ที่ใหญ่กว่า แต่ใช้เวลาน้อยลงในการสร้าง แต่ในขณะที่การบีบอัดที่สูงกว่าคุณจะได้รับไฟล์ที่เล็กกว่าซึ่งใช้เวลาในการสร้างนานกว่า โดยทั่วไปคุณจะได้รับผลตอบแทนลดลง (เช่นขนาดไม่ลดลงมากเมื่อเทียบกับการเพิ่มเวลา) เมื่อขึ้นไปถึงระดับการบีบอัดสูงสุด แต่ก็ขึ้นอยู่กับคุณ


42
นอกจากนี้การบีบอัด PNG จริง ๆ แล้วมีพารามิเตอร์ที่ปรับได้มากมายซึ่งการปรับในทิศทางใดทิศทางหนึ่งสามารถลดขนาดเอาต์พุตขึ้นอยู่กับเนื้อหาของแหล่งที่มา - มันซับซ้อนกว่าตัวเลื่อน "ดีกว่า" และ "แย่" ง่ายกว่ามาก สำหรับวัตถุประสงค์ทั่วไปมันไม่สำคัญเกินไป แต่ถ้าคุณต้องการขนาดที่เล็กที่สุดให้ใช้เครื่องมือเช่นpngcrushนั้นที่สามารถเปรียบเทียบรูปแบบที่หลากหลายที่สุดเท่าที่จะเป็นไปได้
บ๊อบ

4
ระดับการบีบอัดที่สูงขึ้นจะเพิ่มเวลาในการบีบอัด แต่ก็มีผลกับการบีบอัดเช่นกันหรือไม่
Nolonar

10
@Nolonar โดยทั่วไปไม่; หากสิ่งใดระดับการบีบอัดที่สูงกว่าปกติจะลดเวลาในการคลายเนื่องจากมีข้อมูลน้อยกว่าที่ต้องอ่านและประมวลผล เวลาในการบีบอัดที่นานขึ้นนั้นเกิดจากการทำงานอย่างละเอียดมากขึ้นในการค้นหารูปแบบการบีบอัด
ปุย

1
@fluffy LordNeckbeard คำตอบของการบีบอัดที่สูงที่สุดใช้เวลาในการถอดรหัสนานกว่า 5x ที่ต่ำกว่า
André Chalella

1
สำหรับ PNG เป็นเรื่องปกติที่จะมีเวลาในการคลายไฟล์นานขึ้นสำหรับไฟล์ที่บีบอัดได้ดีขึ้น ปัญหาคือเมื่อใช้ PNG เคล็ดลับที่เป็นไปได้ประการหนึ่งคือการใช้อัลกอริทึมการบีบอัดซ้ำแล้วซ้ำอีกตราบใดที่ไฟล์มีขนาดเล็กลง เมื่อขนาดเพิ่มขึ้นคุณจะหยุดใช้ ดังนั้นจึงเป็นไปได้ที่คุณจะใช้อัลกอริทึมการบีบอัด 5 หรือ 6 ครั้งซึ่งหมายความว่าคุณต้องคลายการบีบอัดไฟล์ 5 หรือ 6 เท่าเพื่อแสดงภาพ
yo '

213

PNG ถูกบีบอัด แต่ไม่สูญเสีย

ระดับการบีบอัดเป็นการแลกเปลี่ยนระหว่างขนาดไฟล์และความเร็วในการเข้ารหัส / ถอดรหัส หากต้องการพูดคุยทั่วไปมากเกินไปถึงแม้รูปแบบที่ไม่ใช่รูปภาพเช่น FLAC ก็มีแนวคิดที่คล้ายคลึงกัน

ระดับการบีบอัดที่แตกต่างกันเอาท์พุทถอดรหัสเดียวกัน

แม้ว่าขนาดไฟล์จะแตกต่างกันเนื่องจากระดับการบีบอัดที่แตกต่างกันเอาท์พุทถอดรหัสจริงจะเหมือนกัน

คุณสามารถเปรียบเทียบMD5 hashes ของผลถอดรหัสกับffmpegการใช้Muxer MD5

นี่คือตัวอย่างที่ดีที่สุดที่แสดง:

สร้างไฟล์ PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • โดยค่าเริ่มต้นffmpegจะใช้-compression_level 100สำหรับเอาต์พุต PNG

เปรียบเทียบขนาดไฟล์:

$ du -h *.png
  228K    0.png
  4.0K    100.png

ถอดรหัสไฟล์ PNG และแสดงแฮช MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

เนื่องจากแฮชทั้งคู่เหมือนกันคุณจึงมั่นใจได้ว่าเอาต์พุตที่ถอดรหัส (วิดีโอที่ไม่มีการบีบอัดและดิบ) จะเหมือนกันทุกประการ


26
+1 ไม่ทราบว่า ffmpeg สามารถจัดการ png ได้
Lekensteyn

21
@Lekensteyn มันยิ่งใหญ่สำหรับการทำภาพหน้าจอ ตัวอย่างที่จะข้าม 30 วินาทีและจับภาพหน้าจอ: ffmpeg -ss 30 -i input -vframes 1 output.pngยังดีสำหรับการทำวิดีโอจากภาพและในทางกลับกัน
llogan

หมายความว่า PNG จำเป็นต้องคลายการบีบอัดทุกครั้งที่ต้องเรนเดอร์หรือไม่ เพราะถ้านั่นเป็นเรื่องจริงเราต้องเป็น
akshay2000

หากคุณอ่านไฟล์จากดิสก์หรือแคชอีกครั้งจะต้องทำการแตกไฟล์ ในหน้าเดียวกันแคชอาจจะสามารถนำเวอร์ชันที่คลายการบีบอัดกลับมาใช้ใหม่ได้
David Mårtensson

1
@ akshay2000 ขึ้นอยู่กับว่าโปรแกรมทำงานอย่างไรซึ่งทำให้ PNG โดยปกติไฟล์จะอ่านจากดิสก์จะแตกและบัฟเฟอร์ใน RAM ดังนั้นตราบใดที่บัฟเฟอร์ใน RAM คุณไม่จำเป็นต้องคลายการบีบอัดภาพอีกครั้ง
xZise

24

การบีบอัด PNG เกิดขึ้นในสองขั้นตอน

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

เนื่องจากขั้นตอนที่ 2 เป็นงานที่ใช้เวลามาก / ทรัพยากรมากไลบรารี zlib พื้นฐาน (การห่อหุ้ม raw DEFLATE) ใช้พารามิเตอร์การบีบอัดตั้งแต่ 1 = การบีบอัดที่เร็วที่สุด 9 = การบีบอัดที่ดีที่สุด 0 = ไม่มีการบีบอัด นั่นคือที่มาของช่วง 0-9 และ GIMP เพียงแค่ส่งพารามิเตอร์นั้นไปที่ zlib สังเกตว่าที่ระดับ 0 png ของคุณจะใหญ่กว่าบิตแมปที่เทียบเท่าเล็กน้อย

อย่างไรก็ตามระดับ 9 เป็นเพียง "ดีที่สุด" ที่ zlib จะพยายามและยังคงเป็นวิธีการประนีประนอมอย่างมาก
หากต้องการรับความรู้สึกนี้จริงๆหากคุณยินดีจ่ายพลังการประมวลผลมากกว่า 1,000 เท่าในการค้นหาที่ละเอียดถี่ถ้วนคุณสามารถเพิ่มความหนาแน่นของข้อมูลได้สูงขึ้น 3-8% โดยใช้zopfliแทน zlib
การบีบอัดยังคงไม่มีการสูญเสีย แต่เป็นเพียงการแสดงข้อมูล DEFLATE ที่เหมาะสมที่สุด วิธีนี้เป็นข้อ จำกัด ของไลบรารีที่เข้ากันได้กับ zlib ดังนั้นจึงเป็นการบีบอัด "ดีที่สุด" ที่แท้จริงซึ่งเป็นไปได้ที่จะใช้ PNG


2
หมายเหตุ: เวลาในการบีบอัดจะเท่ากันโดยไม่คำนึงถึงระดับการบีบอัดหรือนับซ้ำเมื่อใช้ zopflipng
Adria

16

แรงจูงใจหลักสำหรับรูปแบบ PNG คือการสร้างทดแทน GIF ที่ไม่เพียง แต่ฟรี แต่ยังปรับปรุงในทุกประการ ด้วยเหตุนี้การบีบอัด PNG จึงไม่สูญเสียข้อมูลทั้งหมดนั่นคือข้อมูลภาพดั้งเดิมสามารถสร้างขึ้นใหม่ได้อย่างแน่นอนบิตสำหรับบิต - เช่นเดียวกับใน GIF และ TIFF รูปแบบส่วนใหญ่

PNG ใช้กระบวนการบีบอัดแบบ 2 ขั้นตอน:

  1. การบีบอัดล่วงหน้า: การกรอง (การทำนาย)
  2. การบีบอัด: ยุบ (ดูวิกิพีเดีย )

ขั้นตอนการบีบอัดล่วงหน้าเรียกว่าการกรองซึ่งเป็นวิธีการแปลงข้อมูลภาพแบบย้อนกลับเพื่อให้กลไกการบีบอัดหลักสามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้น

ตัวอย่างง่ายๆให้พิจารณาลำดับของไบต์ที่เพิ่มขึ้นอย่างสม่ำเสมอจาก 1 เป็น 255:

1, 2, 3, 4, 5, .... 255

เนื่องจากไม่มีการทำซ้ำในลำดับจึงบีบอัดไม่ดีหรือไม่ดีเลย แต่การปรับเปลี่ยนเล็กน้อยของลำดับ - กล่าวคือปล่อยให้ไบต์แรกเพียงอย่างเดียว แต่แทนที่แต่ละไบต์ที่ตามมาด้วยความแตกต่างระหว่างมันและบรรพบุรุษ - แปลงลำดับเป็นชุดที่สามารถบีบอัดได้อย่างมาก:

1, 1, 1, 1, 1, .... 1

การแปลงข้างต้นเป็นแบบไม่สูญเสียเนื่องจากไม่มีการละไบต์และสามารถย้อนกลับได้ทั้งหมด ขนาดที่บีบอัดของซีรี่ส์นี้จะลดลงมาก แต่ชุดเดิมยังสามารถสร้างใหม่ได้อย่างสมบูรณ์แบบ

ข้อมูลภาพที่แท้จริงนั้นไม่ค่อยสมบูรณ์แบบ แต่การกรองจะปรับปรุงการบีบอัดในภาพระดับสีเทาและภาพสี truecolor และสามารถช่วยในการถ่ายภาพพาเล็ต PNG รองรับตัวกรองห้าประเภทและผู้เข้ารหัสอาจเลือกใช้ตัวกรองที่แตกต่างกันสำหรับแต่ละแถวของพิกเซลในภาพ:

ภาพ

อัลกอริธึมทำงานเป็นไบต์ แต่สำหรับพิกเซลขนาดใหญ่ (เช่น 24- บิต RGB หรือ 64- บิต RGBA) จะเปรียบเทียบไบต์ที่สอดคล้องกันเท่านั้นความหมายส่วนประกอบสีแดงของสีพิกเซลจะถูกจัดการแยกต่างหากจากองค์ประกอบพิกเซลสีเขียวและสีน้ำเงิน

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

ระดับการบีบอัดจะถูกกำหนดเป็นตัวเลขระหว่าง 0 (ไม่มี) และ 9 (ดีที่สุด) สิ่งเหล่านี้อ้างถึงการแลกเปลี่ยนระหว่างความเร็วและขนาดและเกี่ยวข้องกับจำนวนชุดตัวกรองแถวที่ต้องลอง ไม่มีมาตรฐานเกี่ยวกับระดับการบีบอัดเหล่านี้ดังนั้นโปรแกรมแก้ไขรูปภาพทุกตัวอาจมีอัลกอริธึมของตัวเองในการพิจารณาถึงจำนวนฟิลเตอร์ที่ควรลองเมื่อปรับขนาดภาพให้เหมาะสมที่สุด

ระดับการบีบอัด 0 หมายถึงไม่ใช้ฟิลเตอร์เลยซึ่งเร็ว แต่ก็สิ้นเปลือง ระดับที่สูงขึ้นหมายถึงมีการลองชุดค่าผสมมากขึ้นเรื่อย ๆ ในแถวรูปภาพและจะมีเพียงชุดค่าผสมที่ดีที่สุดเท่านั้น

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

นอกเหนือจากตัวกรองแล้วระดับการบีบอัดอาจมีผลต่อระดับการบีบอัด zlib ซึ่งเป็นตัวเลขระหว่าง 0 (ไม่มี Deflate) และ 9 (Deflate สูงสุด) ระดับ 0-9 ที่ระบุส่งผลต่อการใช้งานตัวกรองซึ่งเป็นคุณสมบัติการเพิ่มประสิทธิภาพหลักของ PNG ยังขึ้นอยู่กับผู้พัฒนาเครื่องมือ

สรุปได้ว่า PNG มีพารามิเตอร์การบีบอัดที่สามารถลดขนาดไฟล์ได้อย่างมากโดยไม่สูญเสียแม้แต่พิกเซลเดียว

แหล่งที่มา:

วิกิพีเดียเอกสารเครือข่ายแบบพกพา
libpng บทที่ 9 - การบีบอัดและการกรอง


1
ฉันไม่คิดว่าการตั้งค่าระดับการบีบอัดเปลี่ยนแปลงการใช้ตัวกรอง การตั้งค่าระดับ 1-9 อาจเลือกระดับการบีบอัด zlib ระดับ 1-9 และระดับ 0 หมายความว่าอัลกอริทึมแบบยุบไม่ได้ถูกใช้เลย การใช้งานส่วนใหญ่อาจไม่เปลี่ยนแปลงตัวกรองต่อแถว แต่เพียงใช้ตัวกรองเส้นทางตลอดเวลา
Pauli L

@ PauliL: ฉันไม่เห็นด้วยเพราะในการเปรียบเทียบซอฟต์แวร์บีบอัด PNG ทั้งหมดมีความแตกต่างกันอย่างมากระหว่างขนาดของภาพที่สร้างขึ้น หากผลิตภัณฑ์ทั้งหมดใช้พารามิเตอร์เดียวกันสำหรับไลบรารีเดียวกันขนาดทั้งหมดควรเหมือนกันเช่นเดียวกับความเร็ว
harrymc

คุณมีลิงค์ไปยังการเปรียบเทียบดังกล่าวหรือไม่?
Pauli L

@PauliL: การค้นหาอย่างรวดเร็วมาพร้อมกับการเปรียบเทียบนี้
harrymc

@PauliL: คุณอาจถูกต้องที่ระดับการบีบอัด zlib ได้รับผลกระทบจากระดับการบีบอัดของ PNG ฉันได้แก้ไขคำตอบของฉันแล้วแม้ว่าจะไม่มีเครื่องมือบีบอัดที่บันทึกว่าพวกเขาทำอะไร บางทีคำอธิบายสำหรับเครื่องมือที่มีผลลัพธ์ขนาดที่แย่ที่สุดคือพวกเขาไม่ใช้ตัวกรองเลยบีบอัด zlib เท่านั้น
harrymc

5

ตกลงฉันสายเกินไปสำหรับเงินรางวัล แต่นี่คือคำตอบของฉัน

PNG นั้นไม่สูญเสียอะไรเสมอไป มันใช้อัลกอริธึม Deflate / Inflate คล้ายกับที่ใช้ในโปรแกรม zip

อัลกอริธึมยุบค้นหาลำดับไบต์ที่ซ้ำกันและแทนที่ด้วยแท็ก การตั้งค่าระดับการบีบอัดระบุความพยายามของโปรแกรมที่ใช้ในการค้นหาการรวมกันที่เหมาะสมที่สุดของลำดับไบต์และจำนวนหน่วยความจำที่สงวนไว้สำหรับสิ่งนั้น มันเป็นการประนีประนอมระหว่างเวลาและการใช้หน่วยความจำกับขนาดไฟล์บีบอัด อย่างไรก็ตามคอมพิวเตอร์สมัยใหม่นั้นเร็วและมีหน่วยความจำเพียงพอจึงไม่จำเป็นต้องใช้นอกเหนือจากการตั้งค่าการบีบอัดสูงสุด

การใช้งาน PNG จำนวนมากใช้ไลบรารี zlib สำหรับการบีบอัด Zlib มีเก้าระดับการบีบอัด 1-9 ฉันไม่รู้จัก internals ของ Gimp แต่เนื่องจากมีการตั้งค่าระดับการบีบอัด 0-9 (0 = ไม่มีการบีบอัด) ฉันจะถือว่าการตั้งค่านี้เพียงแค่เลือกระดับการบีบอัดของ zlib

อัลกอริธึม Deflate เป็นอัลกอริทึมการบีบอัดวัตถุประสงค์ทั่วไปซึ่งไม่ได้ออกแบบมาสำหรับการบีบอัดรูปภาพ ซึ่งแตกต่างจากรูปแบบไฟล์อิมเมจ lossless อื่น ๆ ส่วนใหญ่รูปแบบ PNG ไม่ได้ จำกัด อยู่แค่นั้น การบีบอัด PNG ใช้ประโยชน์จากความรู้ที่เรามีการบีบอัดภาพ 2D นี่คือความสำเร็จที่เรียกว่าฟิลเตอร์

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

ข้อมูลจำเพาะ PNG ระบุตัวกรองที่แตกต่างกัน 5 ตัว (รวมถึง 0 = ไม่มี) ตัวกรองจะแทนที่ค่าพิกเซลแบบสัมบูรณ์ซึ่งมีความแตกต่างจากพิกเซลก่อนหน้านี้ไปทางซ้ายขึ้นบนเส้นทแยงมุมหรือรวมกัน สิ่งนี้อาจปรับปรุงอัตราส่วนการบีบอัดอย่างมีนัยสำคัญ แต่ละบรรทัดสแกนบนรูปภาพสามารถใช้ตัวกรองที่แตกต่างกัน เครื่องเข้ารหัสสามารถปรับการบีบอัดให้เหมาะสมโดยเลือกตัวกรองที่ดีที่สุดสำหรับแต่ละบรรทัด

สำหรับรายละเอียดของรูปแบบไฟล์ PNG, ดูPNG ข้อมูลจำเพาะ

เนื่องจากมีชุดค่าผสมที่ไม่ จำกัด จำนวนจึงไม่สามารถลองได้ทั้งหมด ดังนั้นกลยุทธ์ประเภทต่างๆจึงได้รับการพัฒนาขึ้นเพื่อหาชุดค่าผสมที่มีประสิทธิภาพ โปรแกรมแก้ไขรูปภาพส่วนใหญ่อาจไม่ได้พยายามปรับตัวกรองให้เหมาะสมที่สุด แต่ควรใช้ตัวกรองแบบคงที่แทน Paeth

โปรแกรมบรรทัดคำสั่งpngcrushพยายามใช้กลยุทธ์หลายอย่างเพื่อค้นหาผลลัพธ์ที่ดีที่สุด สามารถลดขนาดไฟล์ PNG ที่สร้างโดยโปรแกรมอื่นได้อย่างมีนัยสำคัญ แต่อาจใช้เวลาสักครู่ในภาพขนาดใหญ่ ดูแหล่งที่มาของฟอร์จ - pngcrush


3

ระดับการบีบอัดข้อมูลแบบไม่สูญเสียนั้นเป็นเพียงการซื้อขายทรัพยากรเข้ารหัส (โดยทั่วไปคือเวลาบางครั้งก็เป็น RAM) เทียบกับบิตเรต คุณภาพอยู่เสมอ 100%

แน่นอนว่าคอมเพรสเซอร์แบบไม่สูญเสียจะไม่รับประกันการบีบอัดใด ๆ ข้อมูลสุ่มไม่สามารถบีบอัดได้ไม่มีรูปแบบการค้นหาและไม่มีความคล้ายคลึงกัน ทฤษฎีสารสนเทศแชนนอนและทุกสิ่งนั้น จุดรวมของการบีบอัดข้อมูลแบบไม่สูญเสียคือมนุษย์มักทำงานกับข้อมูลที่ไม่สุ่มสูง แต่สำหรับการส่งและการเก็บข้อมูลเราสามารถบีบอัดข้อมูลลงในบิตน้อยที่สุดเท่าที่จะทำได้ หวังว่าจะใกล้เคียงที่สุดกับความซับซ้อนของKolmogorovของต้นฉบับ

ไม่ว่าจะเป็นไฟล์ zip หรือข้อมูลทั่วไป 7z, ภาพ png, flac audio หรือวิดีโอ h.264 (ในโหมด lossless) ก็เป็นสิ่งเดียวกัน สำหรับอัลกอริธึมการบีบอัดบางอย่างเช่น lzma (7zip) และ bzip2 การหมุนการตั้งค่าการบีบอัดจะเพิ่มเวลา CPU ของ DECODER (bzip2) หรือบ่อยครั้งกว่าจำนวน RAM ที่ต้องการ (lzma และ bzip2 และเฟรมอ้างอิง h.264) . บ่อยครั้งที่ตัวถอดรหัสต้องบันทึกเอาท์พุทที่ถอดรหัสใน RAM เนื่องจากการถอดรหัสไบต์ต่อไปอาจหมายถึงไบต์ที่ถอดรหัสหลายเมกะไบต์ที่ผ่านมา (เช่นเฟรมวิดีโอที่คล้ายกันมากที่สุดจากครึ่งวินาทีที่แล้วจะได้รับการเข้ารหัสด้วยการอ้างอิงถึง 12 เฟรมย้อนหลัง ) สิ่งเดียวกันกับ bzip2 และเลือกบล็อกขนาดใหญ่ แต่ก็คลายการบีบอัดได้ช้าลง lzmaมีพจนานุกรมขนาดตัวแปรและคุณสามารถสร้างไฟล์ที่ต้องการ 1


อืมฉันเห็นการใช้งานกับการควบคุมดึงมอเตอร์ไดรฟ์และหัวโดยตรงเพื่อให้การบีบอัด lossless รับประกัน การเข้ารหัสของแมนเชสเตอร์นั้นเอาชนะได้ง่ายหากคุณมีแหล่งสัญญาณนาฬิกาความละเอียดสูง
Joshua

@Joshua: การใช้รูปแบบการจัดเก็บแบบฟิสิคัลที่มีความหนาแน่นสูงนั้นไม่เหมือนกับการบีบอัดข้อมูล ...
SamB

0

ประการแรก PNG นั้นไม่มีความสูญเสียเสมอ ความขัดแย้งที่ชัดเจนนั้นเกิดจากความจริงที่ว่ามีการบีบอัดข้อมูลสองแบบ (สำหรับข้อมูลประเภทใดก็ได้): การสูญเสียและการสูญเสีย

การบีบอัดแบบไม่สูญเสียบีบข้อมูลลง (เช่นขนาดไฟล์) โดยใช้เทคนิคต่างๆทำให้ทุกอย่างและโดยไม่ต้องทำการประมาณใด ๆ ดังนั้นจึงเป็นไปได้ว่าการบีบอัดแบบไม่สูญเสียข้อมูลจะไม่สามารถบีบอัดสิ่งต่าง ๆ ได้เลย (ข้อมูลทางเทคนิคที่มีเอนโทรปีสูงอาจทำได้ยากมากหรือเป็นไปไม่ได้เลยที่จะบีบอัดสำหรับวิธีการแบบไม่สูญเสีย) การบีบอัดข้อมูลแบบสูญเสียนั้น ใกล้เคียงกับข้อมูลจริง แต่การประมาณนั้นไม่สมบูรณ์

นี่เป็นตัวอย่างเล็กน้อยของการบีบอัดแบบไม่สูญเสียข้อมูล: หากคุณมีภาพที่ทำจากพิกเซลดำ 1,000 พิกเซลแทนที่จะเก็บค่าเป็น 1,000 ครั้งสีดำคุณสามารถเก็บจำนวน (1,000) และค่า (สีดำ) จึงบีบอัด 1,000 พิกเซล " ภาพ "เป็นเพียงตัวเลขสองตัว (นี่เป็นรูปแบบดิบของวิธีการบีบอัดแบบไม่สูญเสียข้อมูลที่เรียกว่าการเข้ารหัสแบบรันไทม์)

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