PicScrub logoPicScrub
กลับไปหน้ารูปแบบไฟล์

รูปแบบไฟล์ PNG

Portable Network Graphics

โครงสร้างแบบ chunk

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

ส่วนที่ฉลาดอยู่ในวิธีตั้งชื่อ chunk ถ้าตัวอักษรแรกเป็นตัวพิมพ์ใหญ่ แปลว่าเป็น "critical" (ขาดไปแล้วภาพจะแสดงไม่ได้) ตัวพิมพ์เล็กแปลว่า "ancillary" คือมีก็ดีแต่ไม่จำเป็น chunk เมทาดาต้าทุกตัวที่เราสนใจ เป็นแบบ ancillary ทั้งหมด เราจึงลบมันออกได้อย่างปลอดภัย

โครงสร้างไฟล์ PNG

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 ไบต์
89 50 4E 47 0D 0A 1A 0A
IHDR
25 ไบต์
ส่วนหัวของภาพ (จำเป็น)
Metadata
100 ไบต์
chunk tEXt, iTXt, eXIf
IDAT
ความยาวไม่คงที่
ข้อมูลภาพที่ถูกบีบอัด
IEND
12 ไบต์
มาร์กเกอร์จบไฟล์ภาพ

Signature ของ PNG และ IHDR

Signature ของ PNG
ความยาวของ IHDR (13)
ชนิดของ IHDR
ความกว้าง (256)
ความสูง (256)
ความลึกบิต ชนิดสี ฯลฯ
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

โครงสร้างของ chunk

LengthTypeDataCRC32
4 ไบต์4 ไบต์ไม่คงที่4 ไบต์

กติกาการตั้งชื่อชนิดของ 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

Format: keyword + null + text

zTXt:ข้อความที่ถูกบีบอัด

เหมือน tEXt แต่บีบอัดด้วย zlib ใช้กับข้อความที่ยาวกว่า

iTXt:ข้อความหลายภาษา

ข้อความ UTF-8 ที่จะบีบอัดหรือไม่ก็ได้ รองรับแท็กภาษา และคีย์ที่แปลแล้ว ใช้เก็บเมทาดาต้า XMP

XMP keyword: XML:com.adobe.xmp\0

eXIf:ข้อมูล 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 อย่างไร

1

ตรวจสอบ signature

เช็กว่ามี signature ของ PNG: 89 50 4E 47 0D 0A 1A 0A

2

อ่าน chunk

อ่านความยาวและชนิดของแต่ละ chunk แล้วตรวจสอบ CRC

3

กรอง chunk ที่เป็นเมทาดาต้า

ระบุแล้วข้าม chunk tEXt, zTXt, iTXt, eXIf และ tIME

4

ประกอบไฟล์ขึ้นใหม่

เขียน signature + chunk ที่ผ่านการกรอง + IEND

chunk ที่เก็บไว้

  • • IHDR, PLTE, IDAT, IEND (critical)
  • • sRGB, gAMA, cHRM (เกี่ยวกับสี)
  • • iCCP (โปรไฟล์สี, เลือกได้)
  • • pHYs (ขนาดของพิกเซล)
  • • tRNS (ความโปร่งใส)

chunk ที่ถูกลบ

  • • tEXt (เมทาดาต้าแบบข้อความ)
  • • zTXt (ข้อความที่ถูกบีบอัด)
  • • iTXt (ข้อความหลายภาษา, XMP)
  • • eXIf (ข้อมูล EXIF)
  • • tIME (เวลาที่แก้ไข)