ไฟล์ PNG คืออะไร?
ไฟล์ PNG (Portable Network Graphics) เป็นรูปแบบไฟล์ภาพแรสเตอร์ที่ใช้การบีบอัดแบบไม่สูญเสียข้อมูล รูปแบบไฟล์นี้สร้างขึ้นเพื่อทดแทนรูปแบบการแลกเปลี่ยนกราฟิก (GIF) และไม่มีข้อจำกัดด้านลิขสิทธิ์ อย่างไรก็ตาม รูปแบบไฟล์ PNG ไม่รองรับภาพเคลื่อนไหว รูปแบบไฟล์ PNG รองรับการบีบอัดภาพแบบไม่สูญเสียซึ่งทำให้เป็นที่นิยมในหมู่ผู้ใช้ เมื่อเวลาผ่านไป PNG ได้พัฒนาเป็นหนึ่งในรูปแบบไฟล์รูปภาพที่ใช้กันอย่างแพร่หลาย
ประวัติโดยย่อของรูปแบบไฟล์ PNG
เหตุผลหลักเบื้องหลังการสร้างรูปแบบไฟล์ PNG คืออัลกอริธึมการบีบอัด Lempel-Ziv-Welch ที่ได้รับการจดสิทธิบัตร ซึ่งใช้ในรูปแบบไฟล์ GIF สิ่งนี้พร้อมกับข้อจำกัดอื่นๆ ของ GIF ทำให้ต้องมีการเปลี่ยนรูปแบบไฟล์ GIF ข้อเสนอแรกและชื่อสำหรับรูปแบบไฟล์ PNG มีขึ้นในเดือนมกราคม พ.ศ. 2538 เหตุการณ์สำคัญเกี่ยวกับรูปแบบไฟล์ PNG มีดังต่อไปนี้:
- ตุลาคม 1996: ข้อมูลจำเพาะ PNG เวอร์ชัน 1.0 ได้รับการเผยแพร่และต่อมาปรากฏเป็น RFC 2083 สิ่งเดียวกันนี้กลายเป็นคำแนะนำของ W3C ในเดือนตุลาคม 1996
- ธันวาคม พ.ศ. 2541: เวอร์ชัน 1.1 ซึ่งมีการเปลี่ยนแปลงเล็กน้อยและการเพิ่มส่วนใหม่อีก 3 ส่วนได้รับการปล่อยตัว
- สิงหาคม 1999: เวอร์ชัน 1.2 เพิ่มส่วนพิเศษหนึ่งส่วน ได้รับการปล่อยตัว
- พฤศจิกายน 2546: PNG กลายเป็นมาตรฐานสากล (ISO/IEC 15948:2003) PNG เวอร์ชันนี้แตกต่างจากเวอร์ชัน 1.2 เพียงเล็กน้อย และไม่มีการเพิ่มองค์ประกอบใหม่
- มีนาคม 2547: ISO/IEC 15948:2004
การเปรียบเทียบการทำงานของ GIF และ PNG
รูปแบบไฟล์ PNG ได้รับการออกแบบมาให้เรียบง่ายและพกพาสะดวก ไม่มีข้อผูกมัดตามกฎหมาย ใช้แทนกันได้ ยืดหยุ่นและทนทาน ตารางต่อไปนี้แสดงรายการคุณสมบัติ GIF ที่สืบทอดมาจากรูปแบบไฟล์ PNG นอกเหนือจากคุณสมบัติใหม่
คุณสมบัติ | GIF | PNG |
---|---|---|
ดัชนีภาพสีสูงสุด 256 สี | ใช่ | ใช่ |
รองรับการสตรีม | ใช่ | ใช่ |
ความโปร่งใส | ใช่ | ใช่ |
ข้อมูลเสริม | ใช่ | ใช่ |
ความเป็นอิสระของฮาร์ดแวร์และแพลตฟอร์ม | ใช่ | ใช่ |
มีประสิทธิภาพ | ใช่ | ใช่ |
ภาพสีจริงสูงสุด 48 บิตต่อพิกเซล | ไม่ | ใช่ |
รูปภาพระดับสีเทาสูงสุด 16 บิตต่อพิกเซล | ไม่ | ใช่ |
ช่องอัลฟ่าแบบเต็ม (มาสก์ความโปร่งใสทั่วไป) | ไม่ | ใช่ |
ข้อมูลแกมม่าของภาพ | ไม่ | ใช่ |
ความน่าเชื่อถือ | ไม่ | ใช่ |
การนำเสนอเริ่มต้นเร็วขึ้น | ไม่ | ใช่ |
โครงสร้างไฟล์ PNG
ระบบปฏิบัติการเกือบทั้งหมดรองรับการเปิดไฟล์ PNG ตัวอย่างเช่น โปรแกรมดู Microsoft Windows มีความสามารถในการเปิดไฟล์ PNG เนื่องจากระบบปฏิบัติการมีการสนับสนุนเป็นส่วนหนึ่งของการติดตั้งตามค่าเริ่มต้น ไฟล์ PNG ประกอบด้วย “ลายเซ็น” PNG ตามด้วยชุดของ //chunks//
ส่วนหัวของไฟล์ PNG
แปดไบต์แรกของไฟล์ PNG มีค่า (ทศนิยม) ต่อไปนี้เสมอ:
{{{137 80 78 71 13 10 26 10 }}}
ลายเซ็นนี้ระบุว่าส่วนที่เหลือของไฟล์มีภาพ PNG หนึ่งภาพ ซึ่งประกอบด้วยชุดของชิ้นที่ขึ้นต้นด้วยชิ้น IHDR และลงท้ายด้วยชิ้น IEND
ลูกชิ้น
แต่ละก้อนประกอบด้วยสี่ส่วน:
Length: จำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมายระบุจำนวนไบต์ในช่องข้อมูลของก้อน ความยาวจะนับเฉพาะฟิลด์ข้อมูล ไม่ใช่ตัวมันเอง โค้ดประเภทก้อน หรือ CRC ศูนย์คือความยาวที่ถูกต้อง แม้ว่าตัวเข้ารหัสและตัวถอดรหัสควรถือว่าความยาวนั้นไม่ได้ลงนาม แต่ค่าของมันจะต้องไม่เกิน 231 ไบต์
ประเภทก้อน: โค้ดประเภทก้อนขนาด 4 ไบต์ เพื่อความสะดวกในการอธิบายและตรวจสอบไฟล์ PNG รหัสประเภทจะถูกจำกัดให้ประกอบด้วยตัวอักษร ASCII ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก (AZ และ az หรือทศนิยม 65-90 และ 97-122) อย่างไรก็ตาม ตัวเข้ารหัสและตัวถอดรหัสต้องปฏิบัติต่อรหัสเป็นค่าไบนารีคงที่ ไม่ใช่สตริงอักขระ ตัวอย่างเช่น การแสดงรหัสประเภท IDAT โดยเทียบเท่ากับ EBCDIC ของตัวอักษรเหล่านั้นจะไม่ถูกต้อง หลักเกณฑ์การตั้งชื่อเพิ่มเติมสำหรับประเภทก้อนจะกล่าวถึงในส่วนถัดไป
ข้อมูลก้อน: ไบต์ข้อมูลที่เหมาะสมกับประเภทก้อน ถ้ามี ฟิลด์นี้มีความยาวเป็นศูนย์ได้
CRC: CRC 4 ไบต์ (Cyclic Redundancy Check) คำนวณจากไบต์ก่อนหน้าในกลุ่ม รวมถึงรหัสประเภทกลุ่มและช่องข้อมูลกลุ่ม แต่ไม่รวมช่องความยาว CRC จะแสดงอยู่เสมอ แม้แต่ในส่วนที่ไม่มีข้อมูล
ความยาวของข้อมูลก้อนสามารถเป็นจำนวนไบต์ใดก็ได้จนถึงจำนวนสูงสุด ดังนั้นผู้ดำเนินการจึงไม่สามารถสันนิษฐานได้ว่าชิ้นนั้นจัดชิดขอบใด ๆ ที่ใหญ่กว่าไบต์
ชิ้นสามารถปรากฏในลำดับใดก็ได้ ขึ้นอยู่กับข้อจำกัดที่วางในแต่ละประเภท (ข้อจำกัดที่ชัดเจนประการหนึ่งคือ IHDR ต้องปรากฏก่อน และ IEND ต้องปรากฏเป็นลำดับสุดท้าย ดังนั้นก้อน IEND จึงทำหน้าที่เป็นตัวทำเครื่องหมายจุดสิ้นสุดของไฟล์) ก้อนประเภทเดียวกันหลายชิ้นสามารถปรากฏได้ แต่เฉพาะเมื่ออนุญาตเฉพาะสำหรับประเภทนั้นเท่านั้น
ประเภทก้อน
Chunk Types แบ่งออกเป็น Critical และ Ancillary chunks ตามค่า ASCII ที่คำนึงถึงขนาดตัวพิมพ์ 4 ไบต์ที่กำหนดให้กับ Chunk Type การใช้งานทั้งหมดต้องเข้าใจและแสดงผลส่วนสำคัญมาตรฐานได้สำเร็จ รูปภาพ PNG ที่ถูกต้องต้องมีชิ้น IHDR, ชิ้น IDAT อย่างน้อยหนึ่งชิ้น และชิ้น IEND
การบีบอัด
วิธีการบีบอัด PNG 0 (วิธีการบีบอัดวิธีเดียวที่กำหนดไว้สำหรับ PNG) ระบุการบีบอัดแบบยุบ/ขยายด้วยหน้าต่างเลื่อนที่มีขนาดสูงสุด 32768 ไบต์ การบีบอัดแบบยุบตัวเป็นอนุพันธ์ของ LZ77 ที่ใช้ในโปรแกรม zip, gzip, pkzip และโปรแกรมที่เกี่ยวข้อง มีการทำวิจัยอย่างกว้างขวางเพื่อสนับสนุนสถานะปลอดสิทธิบัตร ข้อมูลที่บีบอัดภายในสตรีมข้อมูล zlib ถูกจัดเก็บเป็นชุดของบล็อก ซึ่งแต่ละบล็อกสามารถแสดงข้อมูลดิบ (ไม่บีบอัด) ข้อมูลบีบอัด LZ77 ที่เข้ารหัสด้วยรหัส Huffman แบบตายตัว หรือข้อมูลที่บีบอัด LZ77 ที่เข้ารหัสด้วยรหัส Huffman แบบกำหนดเอง บิตเครื่องหมายในบล็อกสุดท้ายระบุว่าเป็นบล็อกสุดท้าย ทำให้ตัวถอดรหัสสามารถจดจำจุดสิ้นสุดของสตรีมข้อมูลที่บีบอัดได้
การกรองก่อนการบีบอัด
ใช้ฟิลเตอร์ก่อนการบีบอัดเพื่อเตรียมข้อมูลภาพสำหรับการบีบอัดที่เหมาะสมที่สุด วิธีการกรอง PNG กำหนดประเภทตัวกรองพื้นฐานห้าประเภทดังนี้:
ประเภทตัวกรอง | ชื่อ | ค่าที่คาดการณ์ |
---|---|---|
0 | ไม่มี | เส้นสแกนถูกส่งโดยไม่ได้แก้ไข |
1 | ย่อย | ส่งความแตกต่างระหว่างแต่ละไบต์และค่าของไบต์ที่สอดคล้องกันของพิกเซลก่อนหน้า |
2 | ขึ้น | ตัวกรอง Up() เหมือนกับตัวกรอง Sub() ยกเว้นว่าพิกเซลที่อยู่เหนือพิกเซลปัจจุบันทันที แทนที่จะใช้ทางด้านซ้าย ถูกใช้เป็นตัวทำนาย |
3 | ค่าเฉลี่ย | ตัวกรองค่าเฉลี่ย() ใช้ค่าเฉลี่ยของพิกเซลข้างเคียงสองพิกเซล (ซ้ายและด้านบน) เพื่อทำนายค่าของพิกเซล |
4 | Paeth | ตัวกรอง Paeth() คำนวณฟังก์ชันเชิงเส้นอย่างง่ายของพิกเซลข้างเคียงสามพิกเซล (ซ้าย ด้านบน ซ้ายบน) จากนั้นเลือกพิกเซลข้างเคียงที่ใกล้เคียงกับค่าที่คำนวณได้เป็นตัวทำนาย |
อัลกอริทึมการกรองใช้กับ ‘ไบต์’ ไม่ใช่พิกเซล โดยไม่คำนึงถึงความลึกของบิตหรือประเภทสีของรูปภาพ อัลกอริธึมการกรองทำงานบนลำดับไบต์ที่เกิดจาก scanline หากรูปภาพมีช่องอัลฟา ข้อมูลอัลฟาจะถูกกรองในลักษณะเดียวกับข้อมูลรูปภาพ
เมื่อรูปภาพถูกอินเทอร์เลซ การส่งผ่านของรูปแบบการอินเทอร์เลซแต่ละครั้งจะถือว่าเป็นอิมเมจอิสระเพื่อวัตถุประสงค์ในการกรอง ตัวกรองทำงานในลำดับไบต์ที่เกิดจากพิกเซลจริงที่ส่งผ่านระหว่างการส่งผ่าน และ “สแกนไลน์ก่อนหน้า” คือตัวกรองที่ส่งก่อนหน้านี้ในพาสเดียวกัน ไม่ใช่อันที่อยู่ติดกันในภาพที่สมบูรณ์ โปรดทราบว่าภาพย่อยที่ส่งผ่านหนึ่งรอบจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ แต่มีความกว้างและ/หรือความสูงน้อยกว่าภาพที่สมบูรณ์ การกรองจะไม่ถูกนำไปใช้เมื่อภาพย่อยนี้ว่างเปล่า