รูปแบบไฟล์ PNG
Portable Network Graphics
โครงสร้างแบบ chunk
PNG เป็นหนึ่งในรูปแบบไฟล์ที่โครงสร้างสะอาดที่สุดเท่าที่มีมา ทุกอย่างถูกจัดเป็น "chunk" ซึ่งเป็นบล็อกที่จบในตัวเอง มีทั้งชนิด ข้อมูล และค่าตรวจสอบความถูกต้อง ความสวยงามอยู่ตรงที่ตัวถอดรหัสข้าม chunk ที่มันไม่รู้จักไปได้ นี่คือเหตุผลที่ PNG รองรับเมทาดาต้าได้โดยไม่ทำให้ซอฟต์แวร์เก่าพัง
ส่วนที่ฉลาดอยู่ในวิธีตั้งชื่อ chunk ถ้าตัวอักษรแรกเป็นตัวพิมพ์ใหญ่ แปลว่าเป็น "critical" (ขาดไปแล้วภาพจะแสดงไม่ได้) ตัวพิมพ์เล็กแปลว่า "ancillary" คือมีก็ดีแต่ไม่จำเป็น chunk เมทาดาต้าทุกตัวที่เราสนใจ เป็นแบบ ancillary ทั้งหมด เราจึงลบมันออกได้อย่างปลอดภัย
โครงสร้างไฟล์ PNG
Signature ของ PNG และ IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
โครงสร้างของ chunk
กติกาการตั้งชื่อชนิดของ chunk
- • ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่ = chunk แบบ critical (ต้องเข้าใจให้ได้)
- • ตัวอักษรแรกเป็นตัวพิมพ์เล็ก = chunk แบบ ancillary (ไม่บังคับ ข้ามได้)
- • ตัวอักษรที่สอง = สาธารณะ (ตัวพิมพ์ใหญ่) หรือ ส่วนตัว (ตัวพิมพ์เล็ก)
chunk แบบ critical
chunk เหล่านี้ต้องมีอยู่และต้องอ่านเข้าใจได้ ภาพถึงจะใช้งานได้ PicScrub เก็บ chunk แบบ critical ไว้เสมอ
IHDR:ส่วนหัวของภาพ
chunk แรกถัดจาก signature เก็บความกว้าง ความสูง ความลึกบิต ชนิดสี วิธีบีบอัด วิธีกรอง และวิธีสลับเส้น มีข้อมูลขนาด 13 ไบต์พอดี
IDAT:ข้อมูลภาพ
เก็บข้อมูลภาพที่ถูกบีบอัดไว้ (zlib/deflate) อาจถูกแบ่งออกเป็นหลาย chunk IDAT ได้ และ chunk IDAT ทั้งหมดต้องเรียงติดกัน
IEND:จุดสิ้นสุดของภาพ
บอกจุดสิ้นสุดของสตรีมข้อมูล PNG ต้องเป็น chunk ตัวสุดท้าย และไม่มีข้อมูลอยู่ข้างในเลย
PLTE:จานสี
จำเป็นสำหรับภาพแบบ indexed color (ชนิดสีที่ 3) เก็บรายการสี RGB ในจานสีตั้งแต่ 1 ถึง 256 รายการ
chunk ที่เก็บเมทาดาต้า
chunk แบบ ancillary ที่อาจมีเมทาดาต้าซึ่งกระทบความเป็นส่วนตัวอยู่ข้างใน นี่คือกลุ่มที่ PicScrub ลบออก
tEXt:ข้อความที่ไม่ถูกบีบอัด
คู่คีย์กับค่าในรหัส Latin-1 คีย์ที่พบบ่อย: Author, Description, Copyright, Creation Time, Software
zTXt:ข้อความที่ถูกบีบอัด
เหมือน tEXt แต่บีบอัดด้วย zlib ใช้กับข้อความที่ยาวกว่า
iTXt:ข้อความหลายภาษา
ข้อความ UTF-8 ที่จะบีบอัดหรือไม่ก็ได้ รองรับแท็กภาษา และคีย์ที่แปลแล้ว ใช้เก็บเมทาดาต้า XMP
XML:com.adobe.xmp\0eXIf:ข้อมูล EXIF
ขึ้นทะเบียนเป็นส่วนขยายของ PNG เมื่อปี 2017 เก็บข้อมูล EXIF ดิบในรูปแบบ TIFF โครงสร้างเดียวกับ EXIF ใน JPEG อาจมีทั้ง GPS วันเวลา และข้อมูลอุปกรณ์
iCCP:โปรไฟล์สี ICC
โปรไฟล์สี ICC ที่ฝังไว้ บีบอัดด้วย zlib PicScrub เก็บไว้เป็นค่าเริ่มต้นเพื่อให้สียังตรง
tIME:เวลาที่แก้ไขล่าสุด
เจ็ดไบต์: ปี (2 ไบต์) เดือน วัน ชั่วโมง นาที วินาที เผยให้รู้ว่าภาพถูกแก้ไขครั้งสุดท้ายเมื่อไร
chunk ที่เกี่ยวกับสี
chunk กลุ่มนี้มีผลต่อการแสดงสี แต่โดยทั่วไปไม่มีข้อมูลส่วนบุคคลอยู่ PicScrub จึงเก็บไว้เป็นค่าเริ่มต้น
sRGB
บอกว่าใช้ปริภูมิสี sRGB ใช้หนึ่งไบต์ระบุเจตนาในการแสดงสี
gAMA
ค่าแกมมาเป็นจำนวนเต็มไม่มีเครื่องหมายขนาด 4 ไบต์ (คูณด้วย 100,000)
cHRM
ค่าความเข้มสีของแม่สีและพิกัดจุดสีขาว
sBIT
ความลึกบิตดั้งเดิมของแต่ละช่องสัญญาณสี
การตรวจสอบด้วย CRC32
chunk ของ PNG ทุกตัวมีค่าตรวจสอบ CRC32 ที่คำนวณจากชนิดและข้อมูลของ chunk นั้น เพื่อรับประกันความสมบูรณ์ของข้อมูล
การคำนวณ CRC
CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes) CRC32 output = 4 bytes appended after chunk data // PNG ใช้พหุนาม CRC-32: 0xEDB88320
ทำไม PicScrub ถึงตรวจสอบ CRC
ตอนอ่านไฟล์ PNG นั้น PicScrub จะตรวจ CRC ของแต่ละ chunk เพื่อยืนยันว่าข้อมูลยังสมบูรณ์ ส่วน chunk ที่เสียหายจะถูกจัดการอย่างนุ่มนวล
PicScrub จัดการไฟล์ PNG อย่างไร
ตรวจสอบ signature
เช็กว่ามี signature ของ PNG: 89 50 4E 47 0D 0A 1A 0A
อ่าน chunk
อ่านความยาวและชนิดของแต่ละ chunk แล้วตรวจสอบ CRC
กรอง chunk ที่เป็นเมทาดาต้า
ระบุแล้วข้าม chunk tEXt, zTXt, iTXt, eXIf และ tIME
ประกอบไฟล์ขึ้นใหม่
เขียน signature + chunk ที่ผ่านการกรอง + IEND
chunk ที่เก็บไว้
- • IHDR, PLTE, IDAT, IEND (critical)
- • sRGB, gAMA, cHRM (เกี่ยวกับสี)
- • iCCP (โปรไฟล์สี, เลือกได้)
- • pHYs (ขนาดของพิกเซล)
- • tRNS (ความโปร่งใส)
chunk ที่ถูกลบ
- • tEXt (เมทาดาต้าแบบข้อความ)
- • zTXt (ข้อความที่ถูกบีบอัด)
- • iTXt (ข้อความหลายภาษา, XMP)
- • eXIf (ข้อมูล EXIF)
- • tIME (เวลาที่แก้ไข)