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

รูปแบบไฟล์ HEIC

High Efficiency Image Container

คอนเทนเนอร์ ISOBMFF

ถ้าคุณเคยทำงานกับไฟล์วิดีโอ MP4 มาก่อน HEIC จะรู้สึกคุ้นเคยทันที Apple เลือกใช้ ISO Base Media File Format (ISOBMFF) เป็นคอนเทนเนอร์ ของ HEIC แปลว่ามันมีสายเลือดร่วมกับรูปแบบไฟล์วิดีโอ มากกว่ารูปแบบไฟล์ภาพดั้งเดิมอย่าง JPEG หรือ PNG

รูปแบบนี้ประกอบขึ้นจาก "box" ที่ซ้อนกัน (บางทีเรียกว่า atom) โดยมีรหัสชนิดยาว 4 ตัวอักษร เป็นการออกแบบที่สวยงามอย่างน่าประหลาดใจ รองรับลำดับชั้นของข้อมูลที่ซับซ้อนได้ แต่ก็ยังอ่านง่ายพอสมควร เมื่อคุณเข้าใจพื้นฐานของมันแล้ว

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

ftyp
meta
mdat
ftyp
24 ไบต์
ชนิดไฟล์และแบรนด์
meta
1000 ไบต์
ที่เก็บเมทาดาต้า
mdat
ความยาวไม่คงที่
ข้อมูลสื่อ (HEVC)

ส่วนหัวของ HEIC (box ftyp)

ขนาดของ box (24)
ชนิดของ box (ftyp)
แบรนด์หลัก (heic)
เวอร์ชันย่อย
แบรนด์ที่เข้ากันได้ (mif1)
แบรนด์ที่เข้ากันได้ (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

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

SizeTypeData
4 ไบต์ (BE)4 ไบต์ขนาด - 8

ถ้าขนาดเป็น 1 จะมีฟิลด์ขนาดขยาย 8 ไบต์ตามหลังชนิดของ box มา ถ้าขนาดเป็น 0 แปลว่า box ยาวไปจนจบไฟล์

box ที่สำคัญ

ลำดับชั้นของ box ในไฟล์ HEIC ซ้อนกันลึกได้มาก ไม่เหมือน JPEG ที่เมทาดาต้าอยู่ในตำแหน่งที่เดาได้ HEIC ฝังเมทาดาต้าไว้ลึกลงไป ในโครงสร้างที่ซ้อนกันหลายชั้น นี่คือภาพรวมว่าชิ้นส่วนหลักๆ ประกอบกันอย่างไร

ftyp:ชนิดของไฟล์

box ตัวแรกในไฟล์ เก็บแบรนด์หลักและแบรนด์ที่เข้ากันได้ จำเป็นสำหรับการระบุรูปแบบไฟล์

แบรนด์ที่เข้ากันได้: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta:ที่เก็บเมทาดาต้า

เก็บเมทาดาต้าทั้งหมด ทั้งตำแหน่งของไอเทม คุณสมบัติ และการเชื่อมโยงต่างๆ ข้อมูล 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][GPS Data: 37.7749, -122.4194][Camera: iPhone]
หลัง:  [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

ทำไมต้องเขียนทับด้วยศูนย์

  • • ไฟล์ยังสมบูรณ์:offset ทุกตัวยังใช้ได้เหมือนเดิม
  • • ไม่มีการบีบอัดใหม่:ข้อมูลภาพไม่ถูกแตะเลย
  • • เมทาดาต้าถูกทำลาย:เลขศูนย์ไม่มีข้อมูลอะไรอยู่
  • • กู้คืนได้ไหม:ไม่ได้ ข้อมูลที่ถูกเขียนทับหายไปแล้ว

PicScrub จัดการไฟล์ HEIC อย่างไร

1

อ่านโครงสร้างของ box

ไล่อ่าน ftyp และ meta แบบเรียกซ้ำ แล้วระบุ box ทั้งหมด

2

หาตำแหน่งของเมทาดาต้า

หาคุณสมบัติ Exif และ XMP ในที่เก็บ ipco

3

เขียนทับเนื้อหาเมทาดาต้าด้วยศูนย์

เขียนทับเนื้อหาใน box ที่เก็บเมทาดาต้าด้วยเลขศูนย์

4

รักษาโครงสร้างไว้

เก็บส่วนหัวของ box ขนาด และ offset ทั้งหมดไว้เหมือนเดิม

เรื่องขนาดของไฟล์

เพราะ PicScrub ใช้วิธีเขียนทับด้วยศูนย์แทนการลบออก ไฟล์ผลลัพธ์จึงมีขนาดเท่ากับไฟล์ต้นทาง พื้นที่ของเมทาดาต้ายังอยู่ แต่ถูกเติมด้วยเลขศูนย์แทน

ไฟล์เข้า: 2.5 MB (มี EXIF 50KB)
ไฟล์ออก: 2.5 MB (เป็นเลขศูนย์ 50KB)

HEIC, HEIF และ AVIF ต่างกันอย่างไร

ชื่อพวกนี้ชวนสับสน มาทำความเข้าใจกันให้ชัด HEIF คือรูปแบบคอนเทนเนอร์ ส่วน HEIC และ AVIF บอกว่าใช้ตัวเข้ารหัสอะไรบีบอัดภาพที่อยู่ในคอนเทนเนอร์นั้น

รูปแบบไฟล์คอนเทนเนอร์ตัวเข้ารหัสใครใช้
HEICHEIFHEVC (H.265)อุปกรณ์ของ Apple
HEIFHEIFหลากหลายคอนเทนเนอร์ทั่วไป
AVIFHEIFAV1เว็บ (ไม่มีค่าลิขสิทธิ์)

ทั้งสามแบบใช้โครงสร้างคอนเทนเนอร์ ISOBMFF/HEIF เดียวกัน วิธีของ PicScrub จึงใช้ได้กับทั้งหมด