Vì sao GIF lại nặng đến vậy
GIF ra đời từ năm 1987 và được thiết kế cho đồ họa nhỏ trên đường truyền chậm, không phải cho video. Nó lưu mỗi khung hình thành một ảnh riêng được nén bằng LZW, một phương pháp nén không mất dữ liệu hoạt động tốt với những vùng màu phẳng nhưng kém với mọi thứ có nhiều nhiễu như cảnh quay từ camera, dải chuyển màu hay hạt phim. Không có cơ chế bù chuyển động như các codec video hiện đại, nên một đoạn ba giây ở 25 khung hình/giây là 75 bức ảnh gần như hoàn chỉnh xếp nối tiếp nhau.
Mỗi khung hình còn bị giới hạn ở 256 màu. Khi GIF được tạo từ video, bộ mã hóa thường rải nhiễu dithering khắp mọi khung hình để giả lập những sắc độ còn thiếu, và chính loại nhiễu đó là thứ LZW nén kém nhất. Vì thế mới có những chiếc GIF "reaction" quen thuộc nặng 15 MB, trong khi ở dạng MP4 chỉ khoảng 600 KB.
Dung lượng phụ thuộc vào số khung hình, số điểm ảnh mỗi khung và độ chi tiết màu sắc. Công cụ này giảm cả ba yếu tố.
Ba mức nén thực sự làm gì
Công cụ chạy FFmpeg được biên dịch sang WebAssembly ngay trong trình duyệt và dựng lại GIF qua hai lượt. Lượt đầu phân tích toàn bộ ảnh động và tạo ra một bảng màu tối ưu duy nhất cho nó; lượt thứ hai kết xuất lại từng khung hình bằng bảng màu đó. Khung hình được thu nhỏ bằng bộ lọc Lanczos, giữ cạnh sắc nét hơn so với lấy mẫu lại đơn giản, và màu sắc được ánh xạ bằng dithering có trật tự (Bayer), tạo ra một hoa văn đều đặn nén tốt hơn nhiều so với nhiễu ngẫu nhiên.
- Nhẹ — 15 khung hình/giây, giữ nguyên kích thước gốc, tối đa 256 màu. Phù hợp nhất khi GIF phải giữ kích thước hiện tại, ví dụ bản demo giao diện cần đọc rõ đến từng điểm ảnh.
- Vừa — 12 khung hình/giây, chiều rộng và chiều cao giảm còn 75%, tối đa 128 màu. Đây là mức mặc định và là sự cân bằng tốt cho hầu hết GIF trên website, trong tài liệu và trong các cuộc trò chuyện.
- Mạnh — 10 khung hình/giây, chiều rộng và chiều cao giảm một nửa, tối đa 64 màu. Dùng khi bạn buộc phải vừa một giới hạn nghiêm ngặt, như tệp đính kèm email hay mức tải lên tối đa trên diễn đàn.
Chỉ riêng việc giảm một nửa kích thước đã loại bỏ ba phần tư số điểm ảnh, đó là lý do Mạnh có thể biến một tệp 12 MB thành dưới 2 MB. Nhịp thời gian của ảnh động được giữ nguyên: một vòng lặp ba giây vẫn kéo dài ba giây, chỉ là được vẽ bằng ít khung hình hơn.
Chọn mức nén phù hợp với nội dung
Loại ảnh động quan trọng hơn dung lượng tệp ban đầu.
- Bản ghi màn hình và hướng dẫn giao diện có nhiều vùng phẳng và chữ sắc nét. Chúng chịu được việc giảm màu nhưng bị ảnh hưởng khi thu nhỏ, vì chữ nhỏ sẽ không đọc được nữa. Hãy thử Nhẹ trước; nếu vẫn quá lớn, hãy cắt bản ghi về đúng vùng cần thiết trước khi nén.
- Hình minh họa, logo và sticker với ít màu phẳng trông gần như y hệt ở 64 màu. Mạnh thường dùng được, trừ khi hình vốn đã nhỏ.
- Đoạn trích từ video hoặc cảnh quay camera có dải chuyển màu, màu da và bầu trời. Chúng sẽ bị phân dải màu ở 64 màu, nên Vừa là lựa chọn an toàn hơn. Nếu cả Vừa vẫn quá lớn, có lẽ đoạn clip quá dài cho định dạng GIF.
- Pixel art hoàn toàn không nên thu nhỏ. Hãy dùng Nhẹ, mức giữ nguyên kích thước gốc.
Nếu bạn đang tạo GIF từ video, thường tốt hơn là kiểm soát dung lượng ngay từ lúc tạo bằng Chuyển video sang GIF và giữ đoạn clip ngắn, sau đó nén kết quả nếu cần.
Khi kết quả không như mong đợi
- Tệp gần như không nhỏ đi. Có lẽ tệp nguồn đã được tối ưu sẵn, ví dụ kích thước nhỏ, tốc độ khung hình thấp hoặc đã bị giới hạn ở ít màu. Một GIF chạy ở 8–10 fps hầu như không được lợi gì từ bước giảm tốc độ khung hình. Hãy chuyển lên mức cao hơn một bậc.
- Dải chuyển màu bị phân dải rõ. Đó là do bảng màu 128 hoặc 64 màu. Hãy lùi về mức nhẹ hơn.
- Xuất hiện vân dạng lưới. Đây là hoa văn dithering có trật tự. Nó lộ rõ nhất trên các dải chuyển màu mượt ở mức Mạnh; Nhẹ hoặc Vừa sẽ giảm hiện tượng này.
- Màu lạ ở một cảnh. Vì toàn bộ ảnh động dùng chung một bảng màu, một cảnh ngắn có màu khác thường (một chớp đỏ trong đoạn clip toàn màu xanh) sẽ nhận được ít ô màu hơn.
Giới hạn và quyền riêng tư
Công cụ chấp nhận tệp đến 100 MB và bạn có thể thả nhiều GIF cùng lúc. Chúng được xử lý lần lượt với mức nén đang chọn tại thời điểm đó, và mỗi kết quả hiển thị dung lượng trước và sau. Bạn có thể tải từng tệp riêng hoặc gộp thành một tệp ZIP.
Không có gì được tải lên. Bộ máy FFmpeg chỉ được tải về một lần rồi chạy cục bộ, nên tốc độ xử lý phụ thuộc vào thiết bị của bạn. Một GIF 20 MB thường mất từ vài giây đến một phút; điện thoại chậm hơn laptop, và những ảnh động rất dài có thể làm thiết bị cũ hết bộ nhớ.