日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

研究.jpg图片马赛克问题

發布時間:2025/3/21 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 研究.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表示不確定。它們是不算到段的長度中)。

段的一般結構

名稱字節數數據說明
段標識1FF每個新段的開始標識
段類型1類型編碼(稱作“標記碼”)
段長度2包括段內容和段長度本身,不包括段標識和段類型
段內容<=65533字節

段類型

段類型標記碼說明
SOID8文件頭
EOID9文件尾
SOF0C0幀開始(標準 JPEG)
SOF1C1同上
DHTC4定義Huffman表(霍夫曼表)
SOSDA掃描行開始
SOSDB定義量化表
DRID0定義重新開始間隔
APP0E0定義交換格式和圖像識別信息
COMFE注釋

說明:有的文章也將DNL段(標記碼=DC,定義掃描行數)列為必須段

PS:段類型有30種,但只有10種是必須被所以程序識別的,其它的類型都可以忽略

SOI文件頭

JPEG文件的開始2個字節都是FF D8這是JPEG協議規定的

名稱字節數值
段標識1FF
段類型1D8

也就是這兩個字節構成了JPEG文件頭

APP0圖像識別信息

APP0(圖像識別信息)

名稱字節數值說明
段標識1FF
段類型1E0
段長度20010如果有RGB縮略圖就=16+3*n(以下為段內容)
交換格式54A46494600“JFIF”的ASCII碼
主版本號1
次版本號1
密度單位10=無單位;1=點數/英寸;2=點數/厘米
X像素密度2水平方向的密度
Y像素密度2垂直方向的密度
縮略圖X像素1縮略圖水平像素數目
縮略圖Y像素1縮略圖垂直像素數目
(如果“縮略圖X像素”和縮略圖Y像素的值均>0,那么才有下面的數據)
n=縮略圖像素總數=縮略圖X像素*縮略圖Y像素
  • JFIF是JPEG File Interchange Forma的縮寫,即JPEG文件交換格式,另外還有TIFF等格式,很少用
  • “如果有RGB縮略圖就=16+3*n”是什么意思呢?比如說“縮略圖X像素”和“縮略圖Y像素”的值均為48,就表示有一個48*48像素的縮略圖(n=48*48),縮略圖是24位真彩位圖,用3個字節來表示一個像素,所以共占有3*n個字節。但大多數JPG文件都沒有這個縮略圖
  • 圖像識別信息頭:2個字節 FF E0
  • 段長度:00 10 =>16個字節
  • 交換格式:4A 46 49 46 00=>此處為’JFIF’,一般我們用的都是JFIF的jpeg交換格式,但是也有TFIF的jpeg的交換格式,如果camera sensor直接輸出的是jpeg圖片,那么在其sensor寄存器可以設置使用JFIF還是TFIF
  • 主版本號和次版本號一共2個字節:01 01 =>說明主版本號和次版本號都為1
  • 單位密度1個字節:00=>表示此處使用的是無單位
  • X像素密度2個字節:00 01 =>水平像素密度是1
  • Y像素密度2個字節:00 01 =>水平像素密度是1
  • 縮略圖X像素:00=>沒有縮略圖
  • 縮略圖Y像素:00=>沒有縮略圖
  • RGB縮略圖:此處沒有縮略圖,所以是空的
  • DQT定義量化表

    DQT(定義量化表)

    名稱字節數值說明
    段標識1FF
    段類型1DB
    段長度243其值=3+n(當只有一個QT時)(以下為段內容)
    QT信息10~3:QT號 ;4~7位:QT精度(0=8bit,1字節;否則=16bit,2字節)
    QTnn=64*QT精度的字節數

    說明:

  • JPEG文件一般有2個DQT段,為Y值(亮度)定義1個,為C值(色度)定義1個
  • 一個DQT段可以包含多個QT,每個都有自己的信息字節
  • 此處有兩個DQT數據,第一個是亮度的,第二個是色度的

  • 定義量化表的頭2個字節:FF DB
  • 段長度2個字節: 00 43=>3(段長度2個字節,QT信息1個字節)+QT量化表的長度,此處QT量化表的長度是64
  • QT信息1個字節:00=>0-3位是QT號,4-7位QT精度,此處是0,所以精度是8bit,即1個字節
  • QT量化表:這個長度時根據QT信息確定的,上面QT精度為8bit,所以此處是64*1=64個字節
  • 定義量化表的頭2個字節:FF DB
  • 段長度2個字節: 00 43=>3(段長度2個字節,QT信息1個字節)+QT量化表的長度,此處QT量化表的長度是64
  • QT信息1個字節:01=>0-3位是QT號,即QT號是1,4-7位QT精度,此處是0,所以精度是8bit,即1個字節
  • QT量化表:這個長度時根據QT信息確定的,上面QT精度為8bit,所以此處是64*1=64個字節
  • SOF0圖像基本信息

    SOF0(圖像基本信息)

    名稱字節數值說明
    段標識1FF
    段類型1C0
    段長度2其值=8+組件數量*3 (以下為段內容)
    樣本精度18每個樣本位數(大多數軟件不支持12和16)
    圖片高度2
    圖片寬度2
    組件數量131=灰度圖,3=YCbCr/YIQ,4=CMYK 彩色圖(以下每個組件占用3個字節)
    組件 ID11=Y,2=Cb,3=Cr,4=I,5=Q
    采樣系數10-3位:垂直采樣系數 ;4-7位:水平采樣系數
    量化表號1

    說明:

  • JPEG大都采用yCrCb色彩模型(y表示亮度,Cr表示紅色分量,Cb表示藍色分量),所以組件數量一般=3
  • 樣本就是單個像素的顏色分量,也可理解為一個樣本就是一個組件
  • 采樣系數是實際采樣方式與最高采樣系數之比,而最高采樣系數一般=0.5(分數表示為1/2)。比如說,垂直采樣系數=2,那么2*0.5=1,表示實際采樣方式是每個點采一個樣,也就是逐點采樣;如果垂直采樣系數為1,那么:1*0.5=0.5(分數表示為1/2),表示每兩個點采一個樣
  • 圖像基本信息:FF C2(不知道為什么我這里是C2,我查到的是C0)
  • 段長度2個字節:00 11 =>17=8+3*3,說明組件數量有3個
  • 樣本精度1個字節:08,每個樣本的信息是8bit
  • 樣本高度2個字節:01 84 =>388圖片高度與實際一致
  • 樣本寬度2個字節:02 6C =>620圖片寬度與實際一致
  • 組件數量1個字節:03=>代表YCbCr彩色圖,有三個組件分別是Y,Cb,Cr
  • 每個組件占用3個字節:第一個字節是組件ID,第二個字節是采樣系數,第三個字節是量化表號
  • 此處是:

  • 01 11 00=>Y組件,垂直采樣系數和水平采樣系數都是1,量化標號是0
  • 02 11 01=>Cb組件,垂直采樣系數和水平采樣系數都是1,量化標號是1
  • 03 11 01=>Cr組件,垂直采樣系數和水平采樣系數都是1,量化標號是1
  • //此處可知三個組件都是隔點采樣(標準的YUV422數據:Y采樣是逐點采樣,CbCr都是隔點采樣)

    DHT定義huffman表

    DHT(定義Huffman表)

    名稱字節數值說明
    段標識1FF
    段類型1DB
    段長度2其值=19+n(當只有一個HT表時)(以下為段內容)
    HT信息10-3:HT號;4位:HT類型,0=DC表,1=AC表;5-7位:必須=0
    HT位表16這16個數的和應該<=256
    HT值表nn=表頭16個數的和

    說明:

  • JPEG文件里有2類Haffman表:一類用于DC(直流量),一類用于AC(交流量)。一般有4個表:亮度的DC和AC,色度的AC和DC。最多可有6個
  • 一個DHT段可以包含多個HT表,每個都有自己的信息字節
  • HT表是一個按遞增次序代碼長度排列的符號表
  • 定義Huffman表頭2個字節:FF C4
  • 段長度2個字節:00 1D=>29=19(段長度2字節+HT信息1個字節+HT位表16個字節)+10(這個數代表HT表有10字節)
  • HT信息1個字節:0-3位是HT號,4位是HT類型(0=DC表,1=AC表),5-7位必須為0。HT號位0,此表為DC表
  • HT位表16個字節:這10個數字值和小于等于256
  • 01 00 02 02 03 01 01 00 00 00 00 00 00 00 00 00=>16個字節,加起來10(此處和段長度是相匹配的),說明HT表有10字節
  • HT值表:
  • 00 07 08 01 06 02 04 05 09 03

  • 定義Huffman表頭2個字節:FF C4
  • 段長度2個字節:00 1C=>28=19(段長度2字節+HT信息1個字節+HT位表16個字節)+9(這個數代表HT表有9字節)
  • HT信息1個字節:0-3位是HT號,4位是HT類型(0=DC表,1=AC表),5-7位必須為0。HT號位1,此表為AC表
  • HT位表16個字節:這10個數字值和小于等于256
  • 01 00 01 05 01 01 00 00 00 00 00 00 00 00 00 00=>16個字節,加起來9(此處和段長度是相匹配的),說明HT表有9字節
  • HT值表:
  • 00 01 02 03 04 05 07 06 08

    SOS掃描行開始(圖像數據開始)

    SOS掃描行開始

    名稱字節數值說明
    段標識1FF
    段類型1DA
    段長度2000C其值=6+2*掃描行內組件數量 (以下為段內容)
    掃描行內組件數量13必須>=1,<=4(否則錯誤),通常=3(以下每個組件占用2字節)
    組件ID11=Y,2=Cb,3=Cr,4=I,5=Q
    Huffman表號10-3位:AC表號(其值=0……3);4-7位:DC表號(其值=0……3)
    剩余3個字節3最后3個字節用途不明,忽略

    說明:

  • 緊跟SOS段后的是壓縮的圖像數據(一個個掃描行),數據存放順序是從左到右,從上到下(經過壓縮算法處理過后的)。
  • 掃描行開始的頭:FF DA
  • 段長度2個字節:00 0C=>12=6(2個字節的段長度+1個字節掃描行內組件數量+3個字節的剩余位)+2*3(掃描行內組件數量,每個組件2個字節)
  • 掃描行內組件數量,1個字節:03=>代表組件數量數3
  • 每個組件占用2個字節:
    第一個字節是組件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掃描行結尾

    名稱字節數值
    段標識1FF
    段類型1D9

    這兩個字節構成了JPEG文件尾

    其他段

    COM(注釋)

    名稱字節數值說明
    段標識1FF
    段類型1FE
    段長度2其值=注釋字符的字節數+2
    段內容注釋字符

    說明:有的JPEG文件沒有這個段

    DRI(定義重新開始間隔)

    名稱字節數值說明
    段標識1FF
    段類型1DD
    段長度24(以下為段內容)
    開始間隔2n復位標記的間隔距離

    說明:

  • 開始間隔表示在壓縮數據流中,每隔n個MCU塊就有一個RST標記,RST標記將Huffman的解碼數據流復位,DC也重新從0開始,因此,RST標記是一種復位標記
  • RST標記是一種特殊的段,它只具有段標識和段類型(長度=2字節),但它不是獨立的段,只能穿插在數據流中(文件頭和文件尾也只有段標識和段類型,卻都是獨立的段)
  • RST標記共有8個(RST0-RST7),從RST0起開始使用,然后是RST1……RST7,再從RST0重復
  • RST標記的標識碼是FFD0-FFD7,對應RST0-RST7
  • 補充:這個不是必須段,很多JPEG都沒有
  • JPEG壓縮編碼實例

    DC是指直流系數,是8X8個像素的平均值;AC是交流系數,是8X8個像素的其它值,壓縮數據的排列方式是:亮度DC,AC,色差DC,AC,色差DC,AC

  • 每個分量如Y分量(DC+AC)完成后,如果還剩下位數,應該舍棄,后面的Cb是從下一個字節重新計算
  • 如果編碼到后面沒有壓縮數據了,后面實際編碼數據用0填充
  • 如果編碼已經完成,那么剩余壓縮數據用1填充
  • 紅色色塊編碼

    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图片马赛克问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。