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

รูปแบบไฟล์ GIF

Graphics Interchange Format

โครงสร้างแบบบล็อก

GIF เป็นรูปแบบไฟล์ที่อยู่ยืนยาวเกินอายุขัยที่ควรจะเป็นไปหลายสิบปี CompuServe สร้างมันขึ้นมาตั้งแต่ปี 1987 แต่ทุกวันนี้ก็ยังเห็นได้ทั่วไป ส่วนใหญ่เพราะมันทำภาพเคลื่อนไหวได้

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

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

Header
LSD
GCT
Extensions
Image Data
Trailer
Header
6 ไบต์
GIF87a หรือ GIF89a
LSD
7 ไบต์
Logical Screen Descriptor
GCT
768 ไบต์
ตารางสีหลัก (ถ้ามี)
Extensions
100 ไบต์
บล็อกส่วนขยาย (เมทาดาต้า)
Image Data
ความยาวไม่คงที่
ตัวบรรยายภาพ + ข้อมูล LZW
Trailer
1 ไบต์
ไบต์ปิดท้าย 0x3B

ส่วนหัวของ GIF

signature ของ GIF
เวอร์ชัน (89a)
ความกว้าง (640)
ความสูง (480)
ฟิลด์รวมบิต
ดัชนีสีพื้นหลัง
อัตราส่วนของพิกเซล
OffsetHexASCII
0000
4749463839618002E001F70000
GIF89a.......

ความต่างของแต่ละเวอร์ชัน

GIF87a

สเปกดั้งเดิม ยังไม่มีบล็อกส่วนขยาย

GIF89a

เพิ่มส่วนขยาย ภาพเคลื่อนไหว และความโปร่งใส

บล็อกส่วนขยาย

GIF89a (ฉบับปรับปรุงปี 1989) เพิ่มบล็อกส่วนขยายเข้ามา นี่คือที่มาของความสามารถทำภาพเคลื่อนไหวของ GIF บล็อกส่วนขยายทุกตัวขึ้นต้นด้วย 0x21 ตามด้วยไบต์บอกชนิด จึงสังเกตเห็นได้ง่ายเวลาไล่อ่านไฟล์ บางตัวเราอยากเก็บไว้ (จังหวะเวลาของภาพเคลื่อนไหว) บางตัวเราอยากลบทิ้ง (คอมเมนต์)

Graphic Control Extension (0xF9)

ควบคุมจังหวะเวลาของภาพเคลื่อนไหว ความโปร่งใส และวิธีจัดการเฟรมเดิม อยู่หน้าตัวบรรยายภาพแต่ละตัวใน GIF ที่เคลื่อนไหวได้ เก็บไว้เสมอ

21 F9 04 [disposal] [delay] [transparent] 00

Comment Extension (0xFE)

คอมเมนต์แบบข้อความล้วน ใส่ข้อมูลอะไรก็ได้ ทั้งชื่อผู้สร้าง วันที่สร้าง ซอฟต์แวร์ หรือโน้ตส่วนตัว PicScrub ลบทิ้ง

21 FE [size] [comment data...] 00

Application Extension (0xFF)

ข้อมูลเฉพาะของแต่ละแอปพลิเคชัน ตัวที่สำคัญที่สุดคือ NETSCAPE2.0 ที่ใช้วนซ้ำภาพเคลื่อนไหว และอาจมีเมทาดาต้า XMP อยู่ด้วย

21 FF 0B [app identifier] [auth code] [data...] 00

Plain Text Extension (0x01)

แทบไม่มีใครใช้ ใช้แสดงข้อความโดยอ้างอิงตารางสีของ GIF ซอฟต์แวร์ยุคใหม่ส่วนใหญ่ไม่สนใจมันเลย

ส่วนขยายของแอปพลิเคชัน

NETSCAPE2.0:การวนซ้ำภาพเคลื่อนไหว

ควบคุมว่า GIF เคลื่อนไหวจะวนซ้ำกี่รอบ ถ้าค่าเป็น 0 แปลว่าวนไม่รู้จบ

ตัวเปิดส่วนขยาย
ขนาดบล็อก (11)
NETSCAPE2.0
ขนาดบล็อกย่อย
รหัสบล็อกย่อย
จำนวนรอบที่วน
ไบต์ปิดท้าย
OffsetHexASCII
0000
21FF0B4E45545343415045322E300301000000
!..NETSCAPE2.0.....

PicScrub เก็บ NETSCAPE2.0 ไว้ เพื่อให้ภาพเคลื่อนไหวยังทำงานเหมือนเดิม

XMP Data:Extensible Metadata Platform

ตัวระบุแอปพลิเคชัน: XMP DataXMP เก็บเมทาดาต้า XMP/RDF แบบเต็มในรูปแบบ XML

PicScrub ลบส่วนขยายแอปพลิเคชันแบบ XMP ออก

การรักษาภาพเคลื่อนไหว

เรื่องยากของ GIF คือการแยกให้ออกระหว่างข้อมูลภาพเคลื่อนไหว (ที่เราต้องเก็บไว้) กับเมทาดาต้า (ที่เราอยากลบทิ้ง) เพราะทั้งสองอย่างอยู่ในบล็อกส่วนขยายเหมือนกัน เราจึงลบส่วนขยายทั้งหมดรวดเดียวไม่ได้

เก็บไว้เพื่อภาพเคลื่อนไหว

  • • จำนวนรอบที่วนของ NETSCAPE2.0
  • • Graphic Control Extension
  • • ระยะหน่วงของแต่ละเฟรม
  • • วิธีจัดการเฟรมเดิม
  • • ดัชนีของสีโปร่งใส
  • • ตารางสีเฉพาะเฟรม

ถูกลบ

  • • ส่วนขยายที่เป็นคอมเมนต์
  • • บล็อกแอปพลิเคชันแบบ XMP
  • • บล็อกแอปพลิเคชันที่ไม่รู้จัก
  • • ส่วนขยายแบบข้อความล้วน

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

1

ตรวจสอบส่วนหัว

เช็กว่ามี signature GIF87a หรือ GIF89a

2

คัดลอกข้อมูลส่วนหัว

เก็บ LSD และตารางสีหลักไว้เหมือนเดิม

3

กรองส่วนขยาย

เก็บ NETSCAPE2.0 และ Graphic Control ไว้ ลบคอมเมนต์และ XMP ทิ้ง

4

เก็บข้อมูลภาพไว้

คัดลอกตัวบรรยายภาพ ตารางสีเฉพาะเฟรม และข้อมูล LZW ทั้งหมดแบบไม่แก้ไข

5

เขียนไบต์ปิดท้าย

จบไฟล์ด้วยไบต์ปิดท้าย 0x3B

การบีบอัดแบบ LZW

พูดถึงข้อมูลภาพของ GIF สักนิด มันใช้การบีบอัดแบบ LZW ซึ่งเคยติดสิทธิบัตรจนถึงปี 2004 (จนเกิดดราม่ามากมายในยุค 90) PicScrub ไม่แตะข้อมูลที่ถูกบีบอัดไว้เลยแม้แต่นิดเดียว เราคัดลอกมันมาทีละไบต์ตรงๆ คุณภาพจึงไม่ลดลงเลย

ทำไมเรื่องนี้ถึงสำคัญ

การเก็บข้อมูล LZW ดั้งเดิมไว้ทำให้ PicScrub รับประกันได้ว่า

  • • คุณภาพไม่ลดลง (ภาพเหมือนเดิมทุกบิต)
  • • ประมวลผลเร็ว (ไม่ต้องถอดรหัสแล้วเข้ารหัสใหม่)
  • • ข้อมูลภาพมีขนาดเท่าเดิมเป๊ะ

ข้อจำกัดของเมทาดาต้าใน GIF

ข่าวดีของ GIF คือมันเกิดก่อนมาตรฐาน EXIF จึงไม่ต้องกังวลเรื่องพิกัด GPS หรือข้อมูลกล้อง ประเด็นเรื่องเมทาดาต้าของมันจึงธรรมดากว่ามาก

อะไรบ้างที่อาจหลุดออกไป

ความเสี่ยงด้านความเป็นส่วนตัวของ GIF ถือว่าน้อยเมื่อเทียบกับ JPEG

  • • ส่วนขยายที่เป็นคอมเมนต์ (บางทีมีโน้ตของผู้สร้างอยู่)
  • • เมทาดาต้า XMP (พบไม่บ่อย แต่เป็นไปได้)
  • • ชื่อซอฟต์แวร์ในบล็อกแอปพลิเคชัน