研究.jpg图片马赛克问题
文章目錄
- 前奏
- jpg圖片對比
- jpg圖片格式詳解
- 段的一般結構
- 段類型
- SOI文件頭
- APP0圖像識別信息
- DQT定義量化表
- SOF0圖像基本信息
- DHT定義huffman表
- SOS掃描行開始(圖像數據開始)
- EOI掃描行結尾
- 其他段
- COM(注釋)
- DRI(定義重新開始間隔)
- JPEG壓縮編碼實例
- 紅色色塊編碼
- 黑色色塊編碼
- 對比結果
- 開頭:
- 結尾
- 省略部分分析
前奏
上次做了那個CTFBlink之后,對.jpg圖片挺好奇的,于是準備來研究一下
jpg圖片對比
jpg圖片格式詳解
JPEG圖片格式組成部分:SOI(文件頭)+APP0(圖像識別信息)+DQT(定義量化表)+SOF0(圖像基本信息)+DHT(定義Huffman表)+DRI(定義重新開始間隔)+SOS(掃描行開始)+EOI(文件尾)
JPEG文件的每個段都一定包含兩部分一個是段的標識,它由兩個字節構成:第一個字節是十六進制0xFF,第二個字節對于不同的段,這個值是不同的。
緊接著的兩個字節存放的是這個段的長度(除了前面的兩個字節0xFF和0xXX,X表示不確定。它們是不算到段的長度中)。
段的一般結構
| 段標識 | 1 | FF | 每個新段的開始標識 |
| 段類型 | 1 | 類型編碼(稱作“標記碼”) | |
| 段長度 | 2 | 包括段內容和段長度本身,不包括段標識和段類型 | |
| 段內容 | <=65533字節 |
段類型
| SOI | D8 | 文件頭 |
| EOI | D9 | 文件尾 |
| SOF0 | C0 | 幀開始(標準 JPEG) |
| SOF1 | C1 | 同上 |
| DHT | C4 | 定義Huffman表(霍夫曼表) |
| SOS | DA | 掃描行開始 |
| SOS | DB | 定義量化表 |
| DRI | D0 | 定義重新開始間隔 |
| APP0 | E0 | 定義交換格式和圖像識別信息 |
| COM | FE | 注釋 |
說明:有的文章也將DNL段(標記碼=DC,定義掃描行數)列為必須段
PS:段類型有30種,但只有10種是必須被所以程序識別的,其它的類型都可以忽略
SOI文件頭
JPEG文件的開始2個字節都是FF D8這是JPEG協議規定的
| 段標識 | 1 | FF |
| 段類型 | 1 | D8 |
也就是這兩個字節構成了JPEG文件頭
APP0圖像識別信息
APP0(圖像識別信息)
| 段標識 | 1 | FF | |
| 段類型 | 1 | E0 | |
| 段長度 | 2 | 0010 | 如果有RGB縮略圖就=16+3*n(以下為段內容) |
| 交換格式 | 5 | 4A46494600 | “JFIF”的ASCII碼 |
| 主版本號 | 1 | ||
| 次版本號 | 1 | ||
| 密度單位 | 1 | 0=無單位;1=點數/英寸;2=點數/厘米 | |
| X像素密度 | 2 | 水平方向的密度 | |
| Y像素密度 | 2 | 垂直方向的密度 | |
| 縮略圖X像素 | 1 | 縮略圖水平像素數目 | |
| 縮略圖Y像素 | 1 | 縮略圖垂直像素數目 | |
| (如果“縮略圖X像素”和縮略圖Y像素的值均>0,那么才有下面的數據) | |||
| n=縮略圖像素總數=縮略圖X像素*縮略圖Y像素 |
DQT定義量化表
DQT(定義量化表)
| 段標識 | 1 | FF | |
| 段類型 | 1 | DB | |
| 段長度 | 2 | 43 | 其值=3+n(當只有一個QT時)(以下為段內容) |
| QT信息 | 1 | 0~3:QT號 ;4~7位:QT精度(0=8bit,1字節;否則=16bit,2字節) | |
| QT | n | n=64*QT精度的字節數 |
說明:
此處有兩個DQT數據,第一個是亮度的,第二個是色度的
SOF0圖像基本信息
SOF0(圖像基本信息)
| 段標識 | 1 | FF | |
| 段類型 | 1 | C0 | |
| 段長度 | 2 | 其值=8+組件數量*3 (以下為段內容) | |
| 樣本精度 | 1 | 8 | 每個樣本位數(大多數軟件不支持12和16) |
| 圖片高度 | 2 | ||
| 圖片寬度 | 2 | ||
| 組件數量 | 1 | 3 | 1=灰度圖,3=YCbCr/YIQ,4=CMYK 彩色圖(以下每個組件占用3個字節) |
| 組件 ID | 1 | 1=Y,2=Cb,3=Cr,4=I,5=Q | |
| 采樣系數 | 1 | 0-3位:垂直采樣系數 ;4-7位:水平采樣系數 | |
| 量化表號 | 1 |
說明:
此處是:
//此處可知三個組件都是隔點采樣(標準的YUV422數據:Y采樣是逐點采樣,CbCr都是隔點采樣)
DHT定義huffman表
DHT(定義Huffman表)
| 段標識 | 1 | FF | |
| 段類型 | 1 | DB | |
| 段長度 | 2 | 其值=19+n(當只有一個HT表時)(以下為段內容) | |
| HT信息 | 1 | 0-3:HT號;4位:HT類型,0=DC表,1=AC表;5-7位:必須=0 | |
| HT位表 | 16 | 這16個數的和應該<=256 | |
| HT值表 | n | n=表頭16個數的和 |
說明:
SOS掃描行開始(圖像數據開始)
SOS掃描行開始
| 段標識 | 1 | FF | |
| 段類型 | 1 | DA | |
| 段長度 | 2 | 000C | 其值=6+2*掃描行內組件數量 (以下為段內容) |
| 掃描行內組件數量 | 1 | 3 | 必須>=1,<=4(否則錯誤),通常=3(以下每個組件占用2字節) |
| 組件ID | 1 | 1=Y,2=Cb,3=Cr,4=I,5=Q | |
| Huffman表號 | 1 | 0-3位:AC表號(其值=0……3);4-7位:DC表號(其值=0……3) | |
| 剩余3個字節 | 3 | 最后3個字節用途不明,忽略 |
說明:
第一個字節是組件ID(1=Y,2=Cb,3=Cr,4=I,5=Q);第二個字節0-3AC表,4-7位是DC表。表號的值是0-3
01 00=>Y組件,AC表號是0,DC表號是0
02 10=>Cb組件,AC表號是0,DC表號是1
03 10=>Cr組件,AC表號是0,DC表號是1
EOI掃描行結尾
| 段標識 | 1 | FF |
| 段類型 | 1 | D9 |
這兩個字節構成了JPEG文件尾
其他段
COM(注釋)
| 段標識 | 1 | FF | |
| 段類型 | 1 | FE | |
| 段長度 | 2 | 其值=注釋字符的字節數+2 | |
| 段內容 | 注釋字符 |
說明:有的JPEG文件沒有這個段
DRI(定義重新開始間隔)
| 段標識 | 1 | FF | |
| 段類型 | 1 | DD | |
| 段長度 | 2 | 4(以下為段內容) | |
| 開始間隔 | 2 | n | 復位標記的間隔距離 |
說明:
JPEG壓縮編碼實例
DC是指直流系數,是8X8個像素的平均值;AC是交流系數,是8X8個像素的其它值,壓縮數據的排列方式是:亮度DC,AC,色差DC,AC,色差DC,AC
紅色色塊編碼
51 45 00 14 51 45 00 7F 01010001 01000101 00000000 00010100 01010001 01000101 00000000 01111111計算Y亮度分量=>
0101-0001 01-0001-01首先有一個DC系數需要計算出來 DC亮度計算第一個色差分量 =>
在這里插入代碼片黑色色塊編碼
28 A2 8A 00 28 A2 8A 00 00101000 10100010 10001010 00000000 00101000 10100010 10001010 00000000對比結果
開頭:
結尾
省略部分分析
至F0行開始就是SOS掃描行,一直往下掃描,被省略的是B30行~4E60行,全是掃描行數據(也就是說全是圖像數據),且加密數據,
所以我們嘗試一下SOS掃描行開始段結束這里,加一個掃描行結束標志FF D9(那么圖片肯定是可以顯示出來的(也就是說可以打開),因為它的格式框架是正確的,只是沒有內容而已)
然后保存
猜想正確,直接連馬賽克都沒了。所以的話,馬賽克出現的原因只是因為繪圖未完整而已(至于怎么個未完整法,因為是加密數據………………)
總結
以上是生活随笔為你收集整理的研究.jpg图片马赛克问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [网鼎杯 2020 青龙组]bang
- 下一篇: 以管理员权限来进行解压操作