รูปแบบไฟล์ TIFF
Tagged Image File Format
โครงสร้างส่วนหัว
TIFF คือต้นตระกูลของเมทาดาต้าในภาพ เวลาคุณเห็นข้อมูล EXIF ในไฟล์ JPEG จริงๆ แล้วนั่นคือโครงสร้าง TIFF ที่ฝังอยู่ข้างในไฟล์ เข้าใจ TIFF ได้ก็เท่ากับเข้าใจว่าเมทาดาต้าของภาพส่วนใหญ่ทำงานอย่างไร
ไฟล์เริ่มต้นด้วยส่วนหัวขนาด 8 ไบต์ ที่บอกสองเรื่องสำคัญ คือลำดับไบต์ (Intel หรือ Motorola) และตำแหน่งของ IFD ตัวแรก จากนั้นก็เป็นการไล่ตาม ตัวชี้ไปเรื่อยๆ
โครงสร้างไฟล์ TIFF
ส่วนหัวของ TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
ลำดับไบต์
49 49 (II)Intel:little-endian (ไบต์ที่มีนัยสำคัญน้อยที่สุดมาก่อน)
4D 4D (MM)Motorola:big-endian (ไบต์ที่มีนัยสำคัญมากที่สุดมาก่อน)
โครงสร้างของ IFD
IFD ย่อมาจาก Image File Directory แต่ให้คิดว่ามันคือสารบัญก็ได้ มันคือรายการแท็กแบบแบนราบ ที่แต่ละตัวชี้ไปยังข้อมูลชิ้นหนึ่ง ส่วนที่ฉลาดคือ IFD ชี้ไปหา IFD ตัวอื่นได้ด้วย จึงเกิดเป็นโครงสร้างแบบต้นไม้
การจัดวางของ IFD
โครงสร้างของรายการแท็ก (12 ไบต์)
ถ้าข้อมูลใส่ลงใน 4 ไบต์ได้ มันจะถูกเก็บไว้ในฟิลด์ค่าโดยตรง ถ้าไม่ได้ ฟิลด์ค่าจะเก็บ offset ที่ชี้ไปยังข้อมูลแทน
ชนิดของแท็ก
TIFF กำหนดชนิดข้อมูลไว้เข้มงวดมาก แท็กแต่ละตัวไม่ได้บอกแค่ว่าเก็บอะไรไว้ แต่บอกด้วยว่าต้องตีความไบต์เหล่านั้นอย่างไร นี่คือเหตุผลที่คุณต้องเข้าใจระบบชนิดข้อมูลก่อนจะอ่าน TIFF ได้ถูกต้อง
| ID | ชื่อ | ขนาด | คำอธิบาย |
|---|---|---|---|
| 1 | BYTE | 1 | จำนวนเต็ม 8 บิต ไม่มีเครื่องหมาย |
| 2 | ASCII | 1 | สตริงปิดท้ายด้วย null (8 บิต) |
| 3 | SHORT | 2 | จำนวนเต็ม 16 บิต ไม่มีเครื่องหมาย |
| 4 | LONG | 4 | จำนวนเต็ม 32 บิต ไม่มีเครื่องหมาย |
| 5 | RATIONAL | 8 | LONG สองตัว: ตัวเศษ/ตัวส่วน |
| 6 | SBYTE | 1 | จำนวนเต็ม 8 บิต มีเครื่องหมาย |
| 7 | UNDEFINED | 1 | ไบต์ดิบ (ข้อมูลไบนารี) |
| 8 | SSHORT | 2 | จำนวนเต็ม 16 บิต มีเครื่องหมาย |
| 9 | SLONG | 4 | จำนวนเต็ม 32 บิต มีเครื่องหมาย |
| 10 | SRATIONAL | 8 | SLONG สองตัว: เศษ/ส่วน แบบมีเครื่องหมาย |
| 11 | FLOAT | 4 | ทศนิยม 32 บิตตามมาตรฐาน IEEE |
| 12 | DOUBLE | 8 | ทศนิยม 64 บิตตามมาตรฐาน IEEE |
| 13 | IFD | 4 | ตัวชี้ไปยัง IFD ที่ซ้อนอยู่ |
กฎการเก็บค่า
ถ้า size × count ≤ 4 ไบต์ ค่านั้นจะถูกเก็บไว้ในฟิลด์ค่า ขนาด 4 ไบต์โดยตรง ถ้าไม่ใช่ ฟิลด์นั้นจะเก็บ offset ที่ชี้ไปยังตำแหน่งที่ข้อมูลถูกเก็บไว้ในไฟล์แทน
การคำนวณ offset ของ IFD
ส่วนที่ยากที่สุดของการอ่าน TIFF คือการไล่ตามลูกโซ่ของ offset ทุกอย่างอ้างอิงจากจุดเริ่มต้นของไฟล์ และคุณจะต้องกระโดดไปมาเยอะมาก การคำนวณเป็นแบบนี้
IFD0_offset = bytes[4:8] // จากส่วนหัวของ TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // จากแท็กตัวชี้ (0x8769, 0x8825)
แท็กที่สำคัญ
แท็กของข้อมูลภาพ (เก็บไว้)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsแท็กที่เป็นเมทาดาต้า (ถูกลบ)
0x010F:Make (ผู้ผลิตกล้อง)0x0110:Model (รุ่นของกล้อง)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalแท็กตัวชี้ (Sub-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerSubIFD
IFD หลัก (IFD0) มักมี "แท็กตัวชี้" ที่อ้างอิงไปยังไดเรกทอรีย่อย นี่คือวิธีที่ EXIF, GPS และเมทาดาต้าอื่นๆ ถูกจัดเป็นกลุ่มตามหน้าที่ โดยที่ IFD หลักยังสะอาดอยู่
EXIF SubIFD
เก็บเมทาดาต้าเฉพาะของกล้อง ทั้งการเปิดรับแสง รูรับแสง ISO ความยาวโฟกัส แฟลช สมดุลแสงขาว และอื่นๆ อีกมาก
GPS SubIFD
เก็บข้อมูลตำแหน่ง ทั้งละติจูด ลองจิจูด ความสูง เวลา จำนวนดาวเทียม ความเร็ว และทิศทาง จุดเสี่ยงสำคัญด้านความเป็นส่วนตัว
Maker Notes
ข้อมูลเฉพาะของผู้ผลิตกล้อง รูปแบบต่างกันไปแต่ละเจ้า อาจมีหมายเลขเครื่อง เวอร์ชันเฟิร์มแวร์ และการตั้งค่าส่วนตัวอยู่ด้วย
PicScrub จัดการไฟล์ TIFF อย่างไร
อ่านส่วนหัว
ดูว่าลำดับไบต์เป็นแบบไหน (II/MM) แล้วหาตำแหน่งของ IFD ตัวแรก
สร้างรายการแท็กที่อนุญาต
ระบุแท็กที่จำเป็นต่อการแสดงภาพ
กรองรายการใน IFD
ลบแท็กที่เป็นเมทาดาต้าออก แล้วเซ็ตตัวชี้ SubIFD ให้เป็นศูนย์
เขียนไฟล์ใหม่
ประกอบไฟล์ TIFF ขึ้นใหม่ด้วย IFD ที่สะอาดแล้วและข้อมูลภาพที่คัดลอกมา
การคำนวณ offset ใหม่
ไฟล์ TIFF ใช้ offset ในไฟล์อย่างหนัก เมื่อเมทาดาต้าถูกลบออก PicScrub จึงต้องคำนวณ offset ทั้งหมดใหม่ เพื่อให้ไฟล์ยังสมบูรณ์อยู่