PNG คือการรวมกันของตัวกรอง + LZ77 + Huffman (การรวมกันของ LZ77 + Huffman เรียกว่า Deflate) ตามลำดับ:
ขั้นตอนที่ 1) หากตัวกรองแตกต่างจากไม่มีค่าของพิกเซลจะถูกแทนที่ด้วยความแตกต่างจากพิกเซลที่อยู่ติดกัน (สำหรับรายละเอียดเพิ่มเติมดูhttp://www.libpng.org/pub/png/book/chapter09.html ) . ที่เพิ่มการบีบอัดของภาพที่มีการไล่ระดับสี (ดังนั้น ... 4 5 6 7 กลายเป็น ... 1 1 1 1) และอาจช่วยในพื้นที่ที่มีสีเดียวกัน (... 3 3 3 5 5 5 5 5 5 กลายเป็น 0 0 0 2 0 0 0 0 0) โดยค่าเริ่มต้นตัวกรองจะเปิดใช้งานในรูปภาพ 24 บิตและปิดใช้งานในรูปภาพ 8 บิตพร้อมจานสี
ขั้นตอนที่ 2) ข้อมูลถูกบีบอัดด้วย LZ77 ที่แทนที่สตริงซ้ำ (จับคู่) ของไบต์ด้วย tuple ที่มีระยะห่างจากการจับคู่และความยาวของการจับคู่
ขั้นตอนที่ 3) ผลลัพธ์ของขั้นตอนที่ 2 ถูกเข้ารหัสด้วยรหัส Huffman ที่แทนที่สัญลักษณ์ความยาวคงที่ด้วยรหัสความยาวผันแปรยิ่งสัญลักษณ์ยิ่งรหัสสั้นลง
มีหลายประเด็น:
การเปลี่ยนแปลงเล็กน้อยที่มีผลต่อพิกเซลเพียงเล็กน้อยจะส่งผลให้เกิดการเปลี่ยนแปลงในผลลัพธ์จากการบีบอัด png 3 ขั้นตอน:
1) ค่าตัวกรองของพิกเซลที่อยู่ติดกันจะเปลี่ยน (ขึ้นอยู่กับตัวกรองที่ใช้) ที่จะขยายผลของการเปลี่ยนแปลงเล็กน้อย
2) การเปลี่ยนแปลงจะหมายถึงการจับคู่กับพื้นที่นั้นจะแตกต่างกัน ตัวอย่างเช่นการเปลี่ยน 333333 เป็น 333533 สาเหตุที่เกิดขึ้นอีก 333333 จะไม่ตรงกันอีกต่อไปดังนั้นมันจะเลือกการแข่งขันอื่นเป็น 333333 ด้วยระยะทางที่แตกต่างกันหรือจะเลือกการแข่งขันเดียวกัน แต่มีความยาวที่สั้นกว่าและอีกคู่สำหรับ 3 ไบต์สุดท้าย โดยตัวของมันเองนั้นจะเปลี่ยนผลลัพธ์ได้มากมาย
3) ปัญหาที่ใหญ่ที่สุดคือในขั้นตอนที่ 3 รหัส huffman ใช้จำนวนตัวแปรของบิตดังนั้นแม้การเปลี่ยนแปลงเล็กน้อยจะส่งผลให้ทุกอย่างที่ตามมาไม่ได้จัดแนวอีกต่อไป AFAIK อัลกอริธึมการบีบอัดส่วนใหญ่ไม่สามารถตรวจจับคู่ที่ไม่ได้จัดแนวไบต์เพื่อป้องกันการบีบอัด (หรืออย่างน้อยก็ลดจำนวนมาก) ในข้อมูลที่บีบอัดแล้วซึ่งตามหลังการเปลี่ยนแปลงเว้นแต่คอมเพรสเซอร์จะตรวจจับคู่ที่ไม่ได้จัดแนวไบต์
ปัญหาอื่น ๆ ได้รับการครอบคลุมโดยการตอบกลับอื่น ๆ :
4) Gzip ใช้อัลกอริธึม Deflate เดียวกันกับพจนานุกรม 32KB ดังนั้นหากไฟล์ png ใหญ่กว่า 32KB การจับคู่จะไม่ถูกตรวจจับแม้ว่าจะเหมือนกันก็ตาม Bzip2 ดีกว่าในด้านนั้นเนื่องจากใช้บล็อกขนาด 900 KB XZ ใช้ LZMA ซึ่ง IIRC มีพจนานุกรม 4 MB ในระดับการบีบอัดเริ่มต้น 5) รูปแบบ Zip ไม่ใช้การบีบอัดที่เป็นของแข็งดังนั้นมันจะไม่บีบอัดไฟล์ที่คล้ายกันหรือเหมือนกันกว่านี้
บางทีคอมเพรสเซอร์จากตระกูล PAQ หรือ PPMD อาจบีบอัดได้ดีกว่า แต่ถ้าคุณต้องการบีบอัดไฟล์รูปภาพที่คล้ายกันจำนวนมากคุณสามารถพิจารณาได้ 3 วิธี:
1) จัดเก็บรูปภาพที่ไม่บีบอัด (ด้วย PNG -0 หรือในรูปแบบที่ไม่มีการบีบอัด) และบีบอัดด้วยคอมเพรสเซอร์ที่มีพจนานุกรมหรือบล็อกขนาดใหญ่ (LZMA จะทำงานได้ดี)
2) ตัวเลือกอื่นจะเก็บตัวกรองไว้ แต่เอาการบีบอัดแบบยุบออกจาก PNG ที่สามารถทำได้เช่นกับยูทิลิตี้( AdvDef ) จากนั้นคุณบีบอัด PNG ที่ไม่ได้บีบอัด หลังจากคลายการบีบอัดคุณสามารถเก็บ PNG ที่ไม่บีบอัดหรือบีบอัดอีกครั้งด้วย AdvDef (แต่จะใช้เวลา)
คุณต้องทดสอบทั้งสองวิธีเพื่อดูว่ามีการบีบอัดมากที่สุด
3) ตัวเลือกสุดท้ายคือการแปลงภาพ png ในวิดีโอบีบอัดด้วยวิดีโอแบบ lossless เช่น x264 lossless (ดูแลเป็นพิเศษโดยใช้รูปแบบสีที่ถูกต้อง) จากนั้นในการแยกเฟรมไปยังรูปภาพ png แต่ละภาพ สามารถทำได้ด้วย ffmpeg คุณจะต้องทำการจับคู่ระหว่างหมายเลขเฟรมกับชื่อเดิมต่อไป
นั่นจะเป็นวิธีที่ซับซ้อนที่สุด แต่ถ้า pngs เป็นส่วนหนึ่งของอนิเมชั่นมันอาจจะมีประสิทธิภาพที่สุด อย่างไรก็ตามคุณจะต้องใช้รูปแบบวิดีโอที่รองรับความโปร่งใสหากคุณต้องการ
แก้ไข: นอกจากนี้ยังมีรูปแบบ MNG ที่ไม่ได้ใช้บ่อย