Định dạng GIF
Graphics Interchange Format
Cấu trúc theo khối
GIF là một trong những định dạng sống dai hơn dự đoán tới mấy chục năm. Ra đời năm 1987 do CompuServe tạo ra, tới giờ nó vẫn có mặt khắp nơi, chủ yếu nhờ khả năng làm ảnh động.
Định dạng này dùng cấu trúc theo khối, đơn giản đến mức dễ chịu nếu so với các định dạng hiện đại. Một phần đầu file, vài khối mô tả, một bảng màu, dữ liệu ảnh của bạn, và một byte cuối cùng để nói "hết rồi".
Cấu trúc file GIF
Phần đầu file GIF
| Offset | Hex | ASCII | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 4749463839618002E001F70000 | GIF89a....... | ||||||||||||
Khác biệt giữa hai phiên bản
Bản gốc. Chưa có khối extension.
Thêm extension, ảnh động và độ trong suốt.
Các khối extension
GIF89a (bản sửa đổi năm 1989) thêm các khối extension, và đó chính là cách GIF có được ảnh động. Mọi khối extension đều bắt đầu bằng 0x21 rồi tới một byte kiểu, nên rất dễ nhận ra khi bạn dò qua file. Một số khối chúng ta muốn giữ (nhịp ảnh động), số khác thì muốn xóa (chú thích).
Graphic Control Extension (0xF9)
Điều khiển nhịp ảnh động, độ trong suốt và cách xử lý khung cũ. Nằm ngay trước mỗi khối mô tả ảnh trong GIF động. Luôn được giữ lại.
Comment Extension (0xFE)
Chú thích dạng văn bản thuần. Có thể chứa bất cứ thứ gì, kể cả tác giả, ngày tạo, phần mềm hay ghi chú cá nhân. PicScrub xóa khối này.
Application Extension (0xFF)
Dữ liệu riêng của từng ứng dụng. Quan trọng nhất là NETSCAPE2.0 dùng để lặp ảnh động. Cũng có thể chứa siêu dữ liệu XMP.
Plain Text Extension (0x01)
Hiếm khi được dùng. Vẽ chữ bằng bảng màu của GIF. Phần mềm hiện nay hầu như đều bỏ qua.
Các khối Application Extension
NETSCAPE2.0:vòng lặp ảnh động
Quyết định GIF động lặp lại bao nhiêu lần. Giá trị 0 nghĩa là lặp vô hạn.
| Offset | Hex | ASCII | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 21FF0B4E45545343415045322E300301000000 | !..NETSCAPE2.0..... | ||||||||||||||||||
PicScrub giữ lại NETSCAPE2.0 để ảnh động chạy đúng như cũ.
XMP Data:Extensible Metadata Platform
Định danh ứng dụng: XMP DataXMP. Chứa toàn bộ siêu dữ liệu XMP/RDF ở dạng XML.
PicScrub xóa các khối application extension chứa XMP.
Giữ nguyên ảnh động
Chỗ khó với GIF là phải phân biệt được dữ liệu ảnh động (cần giữ) với siêu dữ liệu (cần xóa). Cả hai đều nằm trong các khối extension, nên không thể cứ thế xóa sạch mọi extension.
Giữ lại cho ảnh động
- • Số lần lặp NETSCAPE2.0
- • Các khối Graphic Control Extension
- • Độ trễ giữa các khung
- • Cách xử lý khung cũ
- • Chỉ mục màu trong suốt
- • Bảng màu cục bộ
Bị xóa
- • Khối chú thích
- • Khối application chứa XMP
- • Khối application lạ không nhận diện được
- • Khối plain text
PicScrub xử lý GIF như thế nào
Kiểm tra phần đầu file
Xác nhận chữ ký GIF87a hoặc GIF89a
Chép phần đầu file
Giữ nguyên LSD và bảng màu toàn cục
Lọc các extension
Giữ NETSCAPE2.0 và Graphic Control, xóa Comment và XMP
Giữ nguyên dữ liệu ảnh
Chép nguyên xi toàn bộ khối mô tả ảnh, bảng màu cục bộ và dữ liệu LZW
Ghi byte kết thúc
Kết thúc file bằng byte 0x3B
Nén LZW
Nói nhanh về dữ liệu ảnh của GIF: nó dùng nén LZW, thứ từng được cấp bằng sáng chế tới tận năm 2004 (gây ra bao nhiêu chuyện ầm ĩ hồi thập niên 90). PicScrub không hề đụng tới phần dữ liệu đã nén. Chúng tôi chép nguyên xi từng byte, nghĩa là chất lượng không suy giảm chút nào.
Vì sao điều này quan trọng
Nhờ giữ nguyên dữ liệu LZW gốc, PicScrub bảo đảm:
- • Không mất chất lượng (ảnh giữ nguyên tới từng bit)
- • Xử lý nhanh (không phải giải nén rồi nén lại)
- • Phần dữ liệu ảnh giữ nguyên dung lượng
Giới hạn siêu dữ liệu của GIF
Tin tốt về GIF là nó ra đời trước chuẩn EXIF, nên không có tọa độ GPS hay thông tin máy ảnh nào để phải lo. Những mối lo về siêu dữ liệu ở đây bình dân hơn nhiều.
Những gì có thể lọt ra ngoài
So với JPEG, rủi ro riêng tư của GIF khá nhỏ:
- • Khối chú thích (đôi khi có ghi chú của tác giả)
- • Siêu dữ liệu XMP (hiếm, nhưng vẫn có thể)
- • Tên phần mềm trong các khối application