รูปแบบไฟล์ HEIC
High Efficiency Image Container
คอนเทนเนอร์ ISOBMFF
ถ้าคุณเคยทำงานกับไฟล์วิดีโอ MP4 มาก่อน HEIC จะรู้สึกคุ้นเคยทันที Apple เลือกใช้ ISO Base Media File Format (ISOBMFF) เป็นคอนเทนเนอร์ ของ HEIC แปลว่ามันมีสายเลือดร่วมกับรูปแบบไฟล์วิดีโอ มากกว่ารูปแบบไฟล์ภาพดั้งเดิมอย่าง JPEG หรือ PNG
รูปแบบนี้ประกอบขึ้นจาก "box" ที่ซ้อนกัน (บางทีเรียกว่า atom) โดยมีรหัสชนิดยาว 4 ตัวอักษร เป็นการออกแบบที่สวยงามอย่างน่าประหลาดใจ รองรับลำดับชั้นของข้อมูลที่ซับซ้อนได้ แต่ก็ยังอ่านง่ายพอสมควร เมื่อคุณเข้าใจพื้นฐานของมันแล้ว
โครงสร้างไฟล์ HEIC
ส่วนหัวของ HEIC (box ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
โครงสร้างของ box
ถ้าขนาดเป็น 1 จะมีฟิลด์ขนาดขยาย 8 ไบต์ตามหลังชนิดของ box มา ถ้าขนาดเป็น 0 แปลว่า box ยาวไปจนจบไฟล์
box ที่สำคัญ
ลำดับชั้นของ box ในไฟล์ HEIC ซ้อนกันลึกได้มาก ไม่เหมือน JPEG ที่เมทาดาต้าอยู่ในตำแหน่งที่เดาได้ HEIC ฝังเมทาดาต้าไว้ลึกลงไป ในโครงสร้างที่ซ้อนกันหลายชั้น นี่คือภาพรวมว่าชิ้นส่วนหลักๆ ประกอบกันอย่างไร
ftyp:ชนิดของไฟล์
box ตัวแรกในไฟล์ เก็บแบรนด์หลักและแบรนด์ที่เข้ากันได้ จำเป็นสำหรับการระบุรูปแบบไฟล์
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:ที่เก็บเมทาดาต้า
เก็บเมทาดาต้าทั้งหมด ทั้งตำแหน่งของไอเทม คุณสมบัติ และการเชื่อมโยงต่างๆ ข้อมูล EXIF/XMP อยู่ในนี้แหละ
meta (ที่เก็บเมทาดาต้า) ├── hdlr (การอ้างอิงตัวจัดการ) ├── pitm (ไอดีของไอเทมหลัก) ├── iloc (ตำแหน่งของไอเทม → offset เข้าไปใน mdat) │ └── รายการ [item_id, offset, length] ├── iinf (ข้อมูลของไอเทม → ใช้หาไอเทม 'Exif') │ └── รายการ infe พร้อมชนิดของไอเทม ├── iprp (คุณสมบัติของไอเทม) │ ├── ipco (ที่เก็บคุณสมบัติ) │ │ ├── hvcC (ค่าตั้งต้นของตัวถอดรหัส HEVC) │ │ ├── ispe (ขนาดของภาพ) │ │ ├── colr (โปรไฟล์ ICC, offset+12) │ │ ├── Exif (EXIF ในรูปแบบ TIFF) │ │ └── pixi (ข้อมูลของพิกเซล) │ └── ipma (การเชื่อมโยงคุณสมบัติ) └── iref (การอ้างอิงระหว่างไอเทม)
mdat:ข้อมูลสื่อ
เก็บข้อมูลภาพที่เข้ารหัสด้วย HEVC จริงๆ โดยมี box iloc ใน meta คอยบอก offset ที่ชี้เข้าไปใน mdat
เมทาดาต้าใน HEIC
ถ้าคุณคุ้นกับมาร์กเกอร์ APP ของ JPEG อยู่แล้ว HEIC ทำอีกแบบเลย แทนที่จะเป็นมาร์กเกอร์เรียงต่อกันที่ต้นไฟล์ เมทาดาต้าของ HEIC อยู่ในรูป "คุณสมบัติของไอเทม" ข้างใน box meta ตัวข้อมูล EXIF ยังอยู่ในรูปแบบ TIFF ที่คุ้นเคย แต่กว่าจะหามันเจอก็ต้องไต่ลำดับชั้นของ box ลงไปก่อน
คุณสมบัติ EXIF
เก็บไว้ใน ipco (ที่เก็บคุณสมบัติของไอเทม) โดยมีชนิดเป็น "Exif" ข้างในเป็นข้อมูล EXIF มาตรฐานในรูปแบบ TIFF เหมือนกับใน JPEG
คุณสมบัติ XMP
เมทาดาต้าบนพื้นฐาน XML ที่เก็บเป็นคุณสมบัติชนิด "mime" ซึ่งมี content-type เป็น "application/rdf+xml"
โปรไฟล์ ICC
โปรไฟล์สีที่เก็บไว้ใน box "colr" โดยมีชนิดเป็น "prof"
ทำไม offset ถึงสำคัญ
box iloc เก็บ offset ระดับไบต์ที่ชี้เข้าไปใน mdat อย่างแม่นยำ ถ้าขนาดของ box ตัวใดเปลี่ยนไป (เช่น จากการลบเมทาดาต้าออก) ก็ต้องคำนวณ offset พวกนี้ใหม่ ไม่อย่างนั้นไฟล์จะอ่านไม่ออก
การทำให้ไม่ระบุตัวตนแบบไม่เสียคุณภาพ
ตรงนี้แหละที่ HEIC เริ่มยุ่งยาก รูปแบบไฟล์นี้ถูกออกแบบมาเพื่อ เก็บภาพและวิดีโออย่างมีประสิทธิภาพ ไม่ได้ออกแบบมาให้แก้ไขเมทาดาต้าได้ง่าย
ความท้าทาย
โครงสร้างของ HEIC ที่อ้างอิง offset ทำให้การตัดไบต์ออกเป็นเรื่องเสี่ยง box iloc เก็บ offset ระดับไบต์ที่ชี้เข้าไปใน mdat อย่างแม่นยำ ถ้าคุณลบ box ออกไปแม้แต่ตัวเดียว offset เหล่านั้นจะผิดหมด และภาพจะเปิดไม่ขึ้นอีกเลย
วิธีเขียนทับด้วยศูนย์
แทนที่จะลบ box ที่เก็บเมทาดาต้าออก PicScrub เขียนทับเนื้อหาข้างใน ด้วยเลขศูนย์ โดยยังคงโครงสร้างและขนาดของ box ไว้เหมือนเดิม
หลัง: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
ทำไมต้องเขียนทับด้วยศูนย์
- • ไฟล์ยังสมบูรณ์:offset ทุกตัวยังใช้ได้เหมือนเดิม
- • ไม่มีการบีบอัดใหม่:ข้อมูลภาพไม่ถูกแตะเลย
- • เมทาดาต้าถูกทำลาย:เลขศูนย์ไม่มีข้อมูลอะไรอยู่
- • กู้คืนได้ไหม:ไม่ได้ ข้อมูลที่ถูกเขียนทับหายไปแล้ว
PicScrub จัดการไฟล์ HEIC อย่างไร
อ่านโครงสร้างของ box
ไล่อ่าน ftyp และ meta แบบเรียกซ้ำ แล้วระบุ box ทั้งหมด
หาตำแหน่งของเมทาดาต้า
หาคุณสมบัติ Exif และ XMP ในที่เก็บ ipco
เขียนทับเนื้อหาเมทาดาต้าด้วยศูนย์
เขียนทับเนื้อหาใน box ที่เก็บเมทาดาต้าด้วยเลขศูนย์
รักษาโครงสร้างไว้
เก็บส่วนหัวของ box ขนาด และ offset ทั้งหมดไว้เหมือนเดิม
เรื่องขนาดของไฟล์
เพราะ PicScrub ใช้วิธีเขียนทับด้วยศูนย์แทนการลบออก ไฟล์ผลลัพธ์จึงมีขนาดเท่ากับไฟล์ต้นทาง พื้นที่ของเมทาดาต้ายังอยู่ แต่ถูกเติมด้วยเลขศูนย์แทน
HEIC, HEIF และ AVIF ต่างกันอย่างไร
ชื่อพวกนี้ชวนสับสน มาทำความเข้าใจกันให้ชัด HEIF คือรูปแบบคอนเทนเนอร์ ส่วน HEIC และ AVIF บอกว่าใช้ตัวเข้ารหัสอะไรบีบอัดภาพที่อยู่ในคอนเทนเนอร์นั้น
| รูปแบบไฟล์ | คอนเทนเนอร์ | ตัวเข้ารหัส | ใครใช้ |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | อุปกรณ์ของ Apple |
| HEIF | HEIF | หลากหลาย | คอนเทนเนอร์ทั่วไป |
| AVIF | HEIF | AV1 | เว็บ (ไม่มีค่าลิขสิทธิ์) |
ทั้งสามแบบใช้โครงสร้างคอนเทนเนอร์ ISOBMFF/HEIF เดียวกัน วิธีของ PicScrub จึงใช้ได้กับทั้งหมด