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