1. Cơ Chế Định Dạng JPEG
Tệp tin JPEG hoạt động dựa trên nguyên lý chia nhỏ dữ liệu thành các đơn vị gọi là Segment. Mỗi segment bao gồm một mã định danh cố định (Marker), chiều dài dữ liệu và nội dung thực tế.
// Mô phỏng cấu trúc Segment tiêu chuẩn
struct Segment {
uint8_t marker; // Ví dụ: 0xFF 0xC0
uint16_t length; // Độ dài nội dung tính từ byte tiếp theo
byte[] data; // Dữ liệu segment cụ thể
};
Các Marker phổ biến quyết định luồng xử lý ảnh:
- SOF (Start Of Frame): Đánh dấu phần đầu khung hình, thường thấy ở mã
FF C0hoặcFF C1. - SOS (Start Of Scan): Bắt đầu quá trình quét dữ liệu nén, mã
FF DA. - EOI (End Of Image): Kết thúc tệp, xác nhận bằng cặp byte
FF D9. - SOC (Start Of Compression): Điểm khởi tạo,
FF D8. - Application Specific: Thông tin bổ sung như JFIF, sử dụng
FF E0.
2. Kiến Trúc File PNG
Định dạng PNG sử dụng phương thức phân mảnh thông qua các khối (Chunks) riêng biệt. Mỗi khối đều tuân theo quy tắc độ dài và checksum để đảm bảo toàn vẹn dữ liệu.
// Chuỗi ký hiệu nhận diện PNG file
const PngSignature = [
0x89, 0x50, 0x4E, 0x47,
0x0D, 0x0A, 0x1A, 0x0A
];
Cấu trúc một Chunk bao gồm: Độ dài (4 bytes), Tên Chunk (4 bytes), Dữ liệu (biến độ dài), và Kiểm tra CRC (4 bytes).
- IHDR: Chứa thuộc tính cơ bản của ảnh (kích thước, độ sâu màu). Chỉ xuất hiện duy nhất một lần tại đầu.
- IDAT: Lưu trữ dữ liệu ảnh đã nén (deflate). Có thể có nhiều khối liên tiếp nhau.
- IEND: Kết thúc chuỗi dữ liệu, CRC cuối cùng sẽ khớp với toàn bộ phần còn lại của tệp.
- PLTE: Bảng màu dành cho ảnh Indexed.
3. Nguyên Lý Xử Lý GIF
GIF thiết lập mô-đun dữ liệu tuần tự với sự hỗ trợ của trailer và delimiter.
class GifStructure {
String HeaderSize = "8";
char MagicNumber[3] = {'G', 'I', 'F'}; // GIF87a hoặc GIF89a
}
Dòng dữ liệu chính được tổ chức theo luồng sau:
- Hệ thống Logic: Xác định kích thước màn hình và bảng màu toàn cục.
- Dữ liệu Ảnh: Các frame chứa thông tin bitmap.
- Special Blocks: Cho phép nhúng metadata hoặc script.
Chuỗi kết thúc luôn được biểu thị bởi byte 0x3B (ký tự ;), giúp trình biên dịch biết khi nào dừng đọc dữ liệu.
4. Cấu Tạo File Bitmap (BMP)
BMP giữ dữ liệu dưới dạng mảng pixel thô hoặc nén RLE. Bộ phận quan trọng nhất là bộ định tuyến bộ nhớ (Offset) dẫn tới vùng lưu pixel.
typedef struct {
unsigned short bfType; // Mã "BM" (0x4D42)
unsigned int bfSize; // Tổng kích thước tệp tính bằng Byte
unsigned int bfOffBits; // Địa chỉ bắt đầu của dữ liệu ảnh thực tế
} BmpFileHeader;
Các chỉ mục quan trọng trong Header cần lưu ý:
- Bắt đầu Header: 0x00 - 0x03 chứa mã tệp và kích thước.
- Trừu tượng dữ liệu: Tại vị trí
bfOffBits(thường là offset 0x36 trong BMP tiêu chuẩn), nơi chứa palette nếu có, sau đó là dữ liệu pixel. - Mô tả ảnh: Bao gồm chiều rộng và chiều cao theo từng dòng scanline.