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

รูปแบบไฟล์ TIFF

Tagged Image File Format

โครงสร้างส่วนหัว

TIFF คือต้นตระกูลของเมทาดาต้าในภาพ เวลาคุณเห็นข้อมูล EXIF ในไฟล์ JPEG จริงๆ แล้วนั่นคือโครงสร้าง TIFF ที่ฝังอยู่ข้างในไฟล์ เข้าใจ TIFF ได้ก็เท่ากับเข้าใจว่าเมทาดาต้าของภาพส่วนใหญ่ทำงานอย่างไร

ไฟล์เริ่มต้นด้วยส่วนหัวขนาด 8 ไบต์ ที่บอกสองเรื่องสำคัญ คือลำดับไบต์ (Intel หรือ Motorola) และตำแหน่งของ IFD ตัวแรก จากนั้นก็เป็นการไล่ตาม ตัวชี้ไปเรื่อยๆ

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

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 ไบต์
ลำดับไบต์ + magic + offset ของ IFD
IFD0
200 ไบต์
ไดเรกทอรีของภาพหลัก
Strip Data
ความยาวไม่คงที่
ข้อมูลพิกเซลของภาพ
EXIF IFD
500 ไบต์
ไดเรกทอรีย่อยของ EXIF
GPS IFD
100 ไบต์
ไดเรกทอรีย่อยของ GPS

ส่วนหัวของ TIFF

ลำดับไบต์ (II = Little Endian)
Magic Number (42)
offset ของ IFD ตัวแรก
OffsetHexASCII
0000
49492A0008000000
II*.....

ลำดับไบต์

49 49 (II)

Intel:little-endian (ไบต์ที่มีนัยสำคัญน้อยที่สุดมาก่อน)

4D 4D (MM)

Motorola:big-endian (ไบต์ที่มีนัยสำคัญมากที่สุดมาก่อน)

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

IFD ย่อมาจาก Image File Directory แต่ให้คิดว่ามันคือสารบัญก็ได้ มันคือรายการแท็กแบบแบนราบ ที่แต่ละตัวชี้ไปยังข้อมูลชิ้นหนึ่ง ส่วนที่ฉลาดคือ IFD ชี้ไปหา IFD ตัวอื่นได้ด้วย จึงเกิดเป็นโครงสร้างแบบต้นไม้

การจัดวางของ IFD

2 ไบต์จำนวนรายการ (จำนวนแท็ก)
12 × N ไบต์รายการแท็ก (ตัวละ 12 ไบต์)
4 ไบต์offset ของ IFD ตัวถัดไป (เป็น 0 ถ้าไม่มี)

โครงสร้างของรายการแท็ก (12 ไบต์)

Tag IDTypeCountValue/Offset
2 ไบต์2 ไบต์4 ไบต์4 ไบต์

ถ้าข้อมูลใส่ลงใน 4 ไบต์ได้ มันจะถูกเก็บไว้ในฟิลด์ค่าโดยตรง ถ้าไม่ได้ ฟิลด์ค่าจะเก็บ offset ที่ชี้ไปยังข้อมูลแทน

ชนิดของแท็ก

TIFF กำหนดชนิดข้อมูลไว้เข้มงวดมาก แท็กแต่ละตัวไม่ได้บอกแค่ว่าเก็บอะไรไว้ แต่บอกด้วยว่าต้องตีความไบต์เหล่านั้นอย่างไร นี่คือเหตุผลที่คุณต้องเข้าใจระบบชนิดข้อมูลก่อนจะอ่าน TIFF ได้ถูกต้อง

IDชื่อขนาดคำอธิบาย
1BYTE1จำนวนเต็ม 8 บิต ไม่มีเครื่องหมาย
2ASCII1สตริงปิดท้ายด้วย null (8 บิต)
3SHORT2จำนวนเต็ม 16 บิต ไม่มีเครื่องหมาย
4LONG4จำนวนเต็ม 32 บิต ไม่มีเครื่องหมาย
5RATIONAL8LONG สองตัว: ตัวเศษ/ตัวส่วน
6SBYTE1จำนวนเต็ม 8 บิต มีเครื่องหมาย
7UNDEFINED1ไบต์ดิบ (ข้อมูลไบนารี)
8SSHORT2จำนวนเต็ม 16 บิต มีเครื่องหมาย
9SLONG4จำนวนเต็ม 32 บิต มีเครื่องหมาย
10SRATIONAL8SLONG สองตัว: เศษ/ส่วน แบบมีเครื่องหมาย
11FLOAT4ทศนิยม 32 บิตตามมาตรฐาน IEEE
12DOUBLE8ทศนิยม 64 บิตตามมาตรฐาน IEEE
13IFD4ตัวชี้ไปยัง IFD ที่ซ้อนอยู่

กฎการเก็บค่า

ถ้า size × count ≤ 4 ไบต์ ค่านั้นจะถูกเก็บไว้ในฟิลด์ค่า ขนาด 4 ไบต์โดยตรง ถ้าไม่ใช่ ฟิลด์นั้นจะเก็บ offset ที่ชี้ไปยังตำแหน่งที่ข้อมูลถูกเก็บไว้ในไฟล์แทน

การคำนวณ offset ของ IFD

ส่วนที่ยากที่สุดของการอ่าน TIFF คือการไล่ตามลูกโซ่ของ offset ทุกอย่างอ้างอิงจากจุดเริ่มต้นของไฟล์ และคุณจะต้องกระโดดไปมาเยอะมาก การคำนวณเป็นแบบนี้

// ตำแหน่งของ IFD0
IFD0_offset = bytes[4:8] // จากส่วนหัวของ TIFF
// ตำแหน่งของ IFD ตัวถัดไป (เช่น IFD1 สำหรับภาพขนาดย่อ)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// ตำแหน่งของ SubIFD (EXIF, GPS)
subIFD_offset = tag_value // จากแท็กตัวชี้ (0x8769, 0x8825)

แท็กที่สำคัญ

แท็กของข้อมูลภาพ (เก็บไว้)

0x0100:ImageWidth
0x0101:ImageLength
0x0102:BitsPerSample
0x0103:Compression
0x0111:StripOffsets
0x0117:StripByteCounts

แท็กที่เป็นเมทาดาต้า (ถูกลบ)

0x010F:Make (ผู้ผลิตกล้อง)
0x0110:Model (รุ่นของกล้อง)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

แท็กตัวชี้ (Sub-IFD)

0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0xA005:InteroperabilityIFDPointer

SubIFD

IFD หลัก (IFD0) มักมี "แท็กตัวชี้" ที่อ้างอิงไปยังไดเรกทอรีย่อย นี่คือวิธีที่ EXIF, GPS และเมทาดาต้าอื่นๆ ถูกจัดเป็นกลุ่มตามหน้าที่ โดยที่ IFD หลักยังสะอาดอยู่

EXIF SubIFD

เก็บเมทาดาต้าเฉพาะของกล้อง ทั้งการเปิดรับแสง รูรับแสง ISO ความยาวโฟกัส แฟลช สมดุลแสงขาว และอื่นๆ อีกมาก

GPS SubIFD

เก็บข้อมูลตำแหน่ง ทั้งละติจูด ลองจิจูด ความสูง เวลา จำนวนดาวเทียม ความเร็ว และทิศทาง จุดเสี่ยงสำคัญด้านความเป็นส่วนตัว

Maker Notes

ข้อมูลเฉพาะของผู้ผลิตกล้อง รูปแบบต่างกันไปแต่ละเจ้า อาจมีหมายเลขเครื่อง เวอร์ชันเฟิร์มแวร์ และการตั้งค่าส่วนตัวอยู่ด้วย

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

1

อ่านส่วนหัว

ดูว่าลำดับไบต์เป็นแบบไหน (II/MM) แล้วหาตำแหน่งของ IFD ตัวแรก

2

สร้างรายการแท็กที่อนุญาต

ระบุแท็กที่จำเป็นต่อการแสดงภาพ

3

กรองรายการใน IFD

ลบแท็กที่เป็นเมทาดาต้าออก แล้วเซ็ตตัวชี้ SubIFD ให้เป็นศูนย์

4

เขียนไฟล์ใหม่

ประกอบไฟล์ TIFF ขึ้นใหม่ด้วย IFD ที่สะอาดแล้วและข้อมูลภาพที่คัดลอกมา

การคำนวณ offset ใหม่

ไฟล์ TIFF ใช้ offset ในไฟล์อย่างหนัก เมื่อเมทาดาต้าถูกลบออก PicScrub จึงต้องคำนวณ offset ทั้งหมดใหม่ เพื่อให้ไฟล์ยังสมบูรณ์อยู่