早在 DOS 時代,雜誌刊登的 BASIC 程式碼中那些密密麻麻的 DATA 語句,就讓我對「數據如何構成圖像」產生濃厚興趣。歷經 ASCII、文字處理格式,最終來到位圖存儲技術——它將計算機眼中的「0 和 1」轉化為螢幕上綿麗的日落、人像、介面。本文將帶你走進六大主流位圖格式內部,揭開它們如何編碼像素、組織元數據、平衡壓縮與相容性的奧秘。
典型 8-bit (256 色) BMP 結構如下:
+------------------+
| BITMAPFILEHEADER | 14 bytes ← 文件類型、大小、數據偏移
+------------------+
| BITMAPINFOHEADER | 40 bytes ← 寬高、色深、壓縮、解析度
+------------------+
| RGBQUAD[256] | 1024 bytes ← 調色盤:索引→RGB 映射
+------------------+
| Pixel Array | 變長 ← 索引值(每像素 1 byte),按行從下往上存
+------------------+
16-bit (5:5:5 或 5:6:5)、24-bit (8:8:8)、32-bit (8:8:8:8) 直接儲存 RGB 值,無調色盤,像素大小固定,解碼最快。
+------------------+
| PCX Header | 128 bytes 固定長度:版本、編碼、寬高、色深、調色盤資訊
+------------------+
| RLE Pixel Data | 變長:單行編碼,標誌位 0xC0 判斷「計數+像素」或「原始像素」
+------------------+
| Palette (opt) | 768 bytes (256×3) 僅 8-bit 模式存在,置於文件尾
+------------------+
+------------------+
| 8-byte Header | 魔數 "II"/"MM" (小/大端) + IFD 偏移
+------------------+
| IFD (Image | 標籤表:每個 Tag = (TagID, Type, Count, Value/Offset)
| File Directory) | 70+ 標準 Tag:寬高、壓縮、調色盤、像素數據、灰階曲線...
+------------------+
| Data Blocks | 由 Tag 指向的實際數據區(可多圖像、多條帶、多平面)
+------------------+
無損、高動態範圍、任意元數據、任意色彩空間(CMYK、Lab、ICC Profile),印刷出版、科學影像、歸檔領域無可替代。
| 格式 | 全稱 | 核心特徵 | 典型應用 |
|---|---|---|---|
| GIF | Graphics Interchange Format | LZW 壓縮、256 色、支援動畫/透明 | 網頁小圖示、簡單動畫 |
| JPEG | Joint Photographic Experts Group | DCT 有損壓縮、YCbCr、品質可調 | 數位相片、網頁圖片 |
| PNG | Portable Network Graphics | Deflate 無損、Alpha 通道、Gamma 校正 | UI 圖示、截圖、需透明場合 |
理解格式內部結構,不僅能寫出健壯的讀寫器,更能在壓縮率、速度、相容性三角中做出最佳工程決策。