Kỹ Thuật Phân Tích Cấu Trúc Header Của Các Định Dạng Ảnh Tiêu Chuẩn

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 C0 hoặc FF 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.

Thẻ: jpeg-marker png-chunk gif-block bmp-structure binary-format

Đăng vào ngày 16 tháng 6 lúc 01:54