JPEG(副檔名常見為 .jpg / .jpeg)其實不是單純「一張圖片」,而是一種具有區段(segment)結構的二進位檔案格式。
JPEG 檔案的整體結構
典型 .JPG 檔案:
SOI
├── APP0 (JFIF)
├── APP1 (Exif)
├── DQT
├── SOF0
├── DHT
├── SOS
│ └── 壓縮影像資料
└── EOI
一、JPEG 的核心概念
JPEG 是:
- 有損壓縮(Lossy Compression)
- 以 8×8 區塊進行 DCT(離散餘弦轉換)
- 使用 Huffman Coding 壓縮
因此:
.jpg本質上是:「壓縮後的頻率資料 + 色彩資訊 + 解碼表」
而不是直接存像素。
二、JPEG 檔案由 Marker 組成
每個區塊前面都有:
FF xx
其中:
FF= 固定開頭xx= Marker 類型
例如:

三、JPEG 最重要的區段
1. SOI(Start Of Image)
檔案開頭:
FF D8
代表:
「這是一個 JPEG 檔」
沒有長度欄位。
這是 JPEG 的「身分證」。如果您在 HxD 中開啟圖片,前兩個位元組一定是 FF D8。如果不是,這張圖片可能損壞或格式不符。
2. APP0(JFIF)
應用程式資訊,通常包含 "JFIF" 字串、版本、解析度:
FF E0
內容:
JFIF
版本
像素密度
縮圖資訊
這是 JPEG 的標準封裝。
3. APP1(Exif)
通常:
FF E1
這是數位相機最重要的 metadata。
包含:
- 拍攝時間
- 相機型號
- GPS
- 快門
- 光圈
- ISO
例如:
Canon EOS R5
f/2.8
1/250 sec
ISO 800
4. DQT(量化表)
Marker:
FF DB
JPEG 壓縮的核心之一。
量化表,定義壓縮品質,通常會有兩個(亮度與色度)。
JPEG 為何能壓縮?
因為:
高頻細節會被「量化」。
例如:
原始 DCT:
52 3 1 0
量化後:
13 1 0 0
高頻資訊被捨棄。
量化表決定:
- 畫質
- 壓縮率
- 模糊程度
四、SOF0(Start Of Frame)
Marker:
FF C0
包含:

影格開始,定義圖片寬高、顏色分量(如 YCbCr)。
這相當於圖片的「規格表」,在此區段中,您可以找到以下資訊:
- 精確度:通常是 8-bit。
- 高度與寬度:以 2 位元組表示。例如寬度 1024 會存成
04 00。 - 顏色分量:通常為 3(代表 YCbCr 或是 RGB)。
例如:
1920 × 1080
YCbCr
五、DHT(Huffman Table)
Marker:
FF C4
霍夫曼表,定義如何對壓縮後的數據進行編碼。
JPEG 使用:
Huffman Coding
將常見數值用較短 bit 表示:

因此檔案更小。
六、SOS(Start Of Scan)
Marker:
FF DA
掃描開始,後面緊接著的就是真正的圖片二進位數據。
這是檔案中體積最大的部分。標記 FF DA 之後,就是經過離散餘弦變換 (DCT) 與霍夫曼編碼處理過的像素資料。
注意:這部分的資料如果出現
0xFF,為了避免被誤認為新標記,編碼器會自動在後面補一個0x00(稱為 Byte Stuffing)。
SOS 後面的資料
包含:
- MCU blocks
- DCT coefficients
- Huffman bitstream
這是整張圖真正的內容。
七、EOI(End Of Image)
檔案結尾:
FF D9
檔案結束,所有 JPEG 必須以此結尾。
八、JPEG 二進位實例
一個最小 JPEG:
FF D8 ; SOI
FF E0 ; APP0
00 10
4A 46 49 46 ; JFIF
FF DB ; DQT
FF C0 ; SOF0
FF C4 ; DHT
FF DA ; SOS
...壓縮資料...
FF D9 ; EOI
九、JPEG 的數學核心
JPEG 壓縮流程:
RGB
↓
YCbCr
↓
色度抽樣
↓
8×8 Block
↓
DCT
↓
Quantization
↓
ZigZag Scan
↓
Run-Length Encoding
↓
Huffman Coding
十、DCT(離散餘弦轉換)
JPEG 最核心數學。
它把:
像素空間轉成:
頻率空間8×8 區塊
每個區塊:
8×8 pixels
會轉成:
8×8 frequency coefficients
低頻 vs 高頻
左上角:
低頻(輪廓)右下角:
高頻(細節)JPEG 會:
保留低頻
丟棄高頻
因此人眼不易察覺。
十一、ZigZag Scan
DCT 後:
8×8 matrix
會被:
Z 字形掃描
原因:
高頻通常很多 0。
方便:
- Run-Length Encoding
- Huffman
十二、YCbCr 色彩空間
JPEG 不直接用 RGB。
而使用:
Y = 亮度
Cb = 藍色差
Cr = 紅色差
原因:
人眼對亮度較敏感。
因此:
- Y 保留較多
- Cb/Cr 可降低解析度
十三、色度抽樣(Chroma Subsampling)
例如:
4:4:44:2:24:2:0
最常見:
4:2:0
代表:
色彩解析度只有亮度的 1/4。
但肉眼不太容易發現。
十四、Baseline JPEG / Progressive JPEG
Baseline JPEG
一般 JPG:
由上到下解碼Progressive JPEG
先模糊:
逐步清晰網頁常用。
十五、JPEG 的限制
1. 有損壓縮
每次重新存檔:
畫質下降2. 不適合文字
因為:
高頻邊界容易模糊。
3. 不支援透明
JPEG 沒 Alpha Channel。
十六、JPEG vs PNG

十七、如何手動解析 JPG?
可用:
- Hex Editor
- Python
- C
- ExifTool
Python 範例
with open("test.jpg", "rb") as f:
data = f.read()
print(data[:20].hex())
若看到:
ffd8ffe0
就是 JPEG。
十八、JPEG 為何能成為歷史霸主?
因為它在:
畫質 / 體積
之間取得極佳平衡。
尤其適合:
- 數位相機
- 網頁照片
- 手機圖片
即使今天有:
- WebP
- AVIF
- HEIC
JPEG 仍是世界最普及圖片格式之一。
十九、JPEG 的資訊理論本質
JPEG 本質其實是:
人類視覺系統模型它利用:
- 人眼不敏感高頻
- 人眼較不敏感色差
來「有選擇地丟資訊」。
因此 JPEG 不是純數學壓縮:
而是:
心理視覺壓縮(Psychovisual Compression)二十、JPEG 檔案結構總結
JPEG
├── Metadata
│ ├── JFIF
│ └── EXIF
│
├── Quantization Tables
│
├── Huffman Tables
│
├── Frame Information
│
├── Scan Data
│ ├── DCT
│ ├── ZigZag
│ ├── RLE
│ └── Huffman Bitstream
│
└── End Marker
整個 .jpg 檔:
其實是一套「如何重建影像」的壓縮說明書。
二十一、實戰練習:在 HxD 中查看
您可以試著用 HxD 開啟 .jpg/.jpeg 圖檔,觀察以下細節:
- 開頭驗證:確認 Offset
0是FF D8。 - 尋找內容資訊:在 HxD 右側的字元區,您通常會看到
JFIF(在FF E0段落)。 - 末端驗證:捲動到檔案最下方,確認最後兩個位元組是
FF D9。
二十二、常見問題:JPG vs JPEG?
結構上完全一樣。這純粹是歷史遺留問題:早期 Windows(DOS 時代)副檔名只能有三個字元,所以使用 .jpg;而 Unix 系統則使用較完整的 .jpeg。
這張命盤圖檔中存儲的是靜態視覺資訊,如果檔案結構在 SOS 段落受損,圖片就會出現色彩偏移或破裂的現象。





















