本發(fā)明涉及碎片圖片重組領域,特別涉及一種自動化檢驗jpeg圖片是否正常的方法。
背景技術(shù):
::jepg是一種比較常見的圖片格式,在存儲介質(zhì)上創(chuàng)建文件后對文件進行刪除、修改會造成文件內(nèi)容的丟失或者碎片化,通過row掃描等恢復方法當對其進行數(shù)據(jù)修復后,得到的圖片很有可能不是一張完整或者說正常的圖片,當存儲介質(zhì)中存有大量jepg圖片時,此時若人為判斷恢復的圖片是否正常將是一個非常耗時耗力的工作。技術(shù)實現(xiàn)要素:本發(fā)明針對現(xiàn)有技術(shù)的不足,提供了一種自動化檢驗jpeg圖片是否正常的方法,用以解決人為判斷恢復的圖片是否正常耗時耗力的問題。為解決以上問題,本發(fā)明采用的技術(shù)方案如下:一種自動化檢驗jpeg圖片是否正常的方法,步驟如下:s1讀取圖片數(shù)據(jù),圖片數(shù)據(jù)分為文件頭信息和文件信息;s2在讀取的圖片文件頭信息中查找soi標記位,也就是ffd8數(shù)據(jù),若不存在則認為此圖片不正常,存在則表示此處為圖片文件的開始標記;s3檢驗dqt量化表標記,查找ffdb標記位,該標記位后為2byte表示長度的數(shù)據(jù),根據(jù)此長度,檢驗標記位后此長度的這段數(shù)據(jù);檢驗dht量化表標記,查找ffc4標記位,標記位后為2byte表示長度的數(shù)據(jù),根據(jù)此長度,檢驗標記位后此長度的這段數(shù)據(jù);檢驗sofo幀圖開始標記,查找ffc0標記位,包含9個具體字段,一一檢驗字段是否符合規(guī)則,若不符合則為不正常;檢驗sos幀圖開始標記,查找ffda標記位,包含2個具體字段,一一檢驗字段是否符合規(guī)則,若不符合則為不正常;s4檢驗eoi圖像結(jié)束,在讀取的圖片文件頭信息中查找eoi標記位,也就是ffd9數(shù)據(jù),若不存在則認為此圖片不正常,存在則表示此處為圖片文件的結(jié)束標記。作為優(yōu)選,檢驗dqt量化表標記具體如下:第1byte為精度及量化表id,高4位:精度,只有兩個可選值0和1,0表示8位;1表示16位,低4位:量化表id,取值范圍為0~3;再后面是表項,長度為64*(精度+1)byte。作為優(yōu)選,檢驗dht量化表標記具體如下:第1byte為編碼表類型和表id,高4位:類型,只有兩個值可選0和1,0表示dc直流;1表示ac交流;低4位:哈夫曼表id,dc表和ac表分開編碼;再后面數(shù)據(jù)長度為16+nbyte。本發(fā)明的有益效果如下:通過本發(fā)明的方法可以自動檢驗jpeg圖片是否正常,解決了人為判斷恢復的圖片是否正常耗時耗力的問題。附圖說明圖1為本發(fā)明實施例的流程示意圖。具體實施方式為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下參照附圖并舉實施例,對本發(fā)明做進一步詳細說明。原理介紹:(一)jpeg文件格式介紹jpeg文件使用的數(shù)據(jù)存儲方式有多種。最常用的格式稱為jpeg文件交換 格式(jpegfileinterchangeformat,jfif)。而jpeg文件大體上可以分成兩個部分:標記碼(tag)和壓縮數(shù)據(jù)。標記碼由兩個字節(jié)構(gòu)成,其前一個字節(jié)是固定值0xff,后一個字節(jié)則根據(jù)不同意義有不同數(shù)值。在每個標記碼之前還可以添加數(shù)目不限的無意義的0xff填充,也就說連續(xù)的多個0xff可以被理解為一個0xff,并表示一個標記碼的開始。而在一個完整的兩字節(jié)的標記碼后,就是該標記碼對應的壓縮數(shù)據(jù)流,記錄了關(guān)于文件的諸種信息。常用的標記有soi、app0、dqt、sof0、dht、dri、sos、eoi。注意,soi等都是標記的名稱。在文件中,標記碼是以標記代碼形式出現(xiàn)。例如soi的標記代碼為0xffd8,即在jpeg文件中的如果出現(xiàn)數(shù)據(jù)0xffd8,則表示此處為一個soi標記。下面僅列出幾個常用標記的標記代碼、占用字節(jié)長度和表示的意義。soi,startofimage,圖像開始標記代碼2字節(jié)固定值0xffd8app0,application,應用程序保留標記0標記代碼2字節(jié)固定值0xffe0appn,application,應用程序保留標記n,其中n=1~15(任選)標記代碼2字節(jié)固定值0xffe1~0xfffdqt,definequantizationtable,定義量化表標記代碼2字節(jié)固定值0xffdbsof0,startofframe,幀圖像開始標記代碼2字節(jié)固定值0xffc0dht,difinehuffmantable,定義哈夫曼表標記代碼2字節(jié)固定值0xffc4dri,definerestartinterval,定義差分編碼累計復位的間隔標記代碼2字節(jié)固定值0xffddsos,startofscan,掃描開始標記代碼2字節(jié)固定值0xffdaeoi,endofimage,圖像結(jié)束標記代碼2字節(jié)固定值0xffd9補充說明,由于在jpeg文件中0xff具有標志性的意思,所以在壓縮數(shù)據(jù)流(真正的圖像信息)中出現(xiàn)0xff,就需要作特別處理。具體方法是,在數(shù)據(jù)0xff后添加一個沒有意義的0x00。換句話說,如果在圖像數(shù)據(jù)流中遇到0xff,應該檢測其緊接著的字符,如果是1)0x00,則表示0xff是圖像流的組成部分,需要進行譯碼;2)0xd9,則與0xff組成標記eoi,則圖像流結(jié)束,同時圖像文件結(jié)束;3)0xd0~0xd7,則組成rstn標記,則要忽視整個rstn標記,即不對當前0xff和緊接的0xdn兩個字節(jié)進行譯碼,并按rst標記的規(guī)則調(diào)整譯碼變量;4)0xff,則忽視當前0xff,對后一個0xff再作判斷;5)其他數(shù)值,則忽視當前0xff,并保留緊接的此數(shù)值用于譯碼。(二)jpeg解碼過程詳解(1)讀入jpeg/jfif文件的相關(guān)信息按照jfif文件格式,將jpeg文件相關(guān)的字段信息一一讀取出來,并進行相應的解析。例如,圖像的寬度、高度、量化表、huffman表、水平/垂直采樣因子等。一般而言,jfif格式文件的讀取順序依次為:soi字段;app0字段;appn字段;dqt字段;sofo字段;dht字段;sos字段;壓縮數(shù)據(jù)字段;eoi 字段;讀取jpeg文件相關(guān)信息的時候,有兩點需要特別注意:(a)由于jpeg中以0xff來做為特殊標記符,因此,如果某個像素的取值為0xff,那么實際在保存的時候,是以0xff00來保存的,從而避免其跟特殊標記符0xff之間產(chǎn)生混淆。所以,在讀取文件信息的時候,如果遇0xff00,就必須去除后面的00;即,將0xff00當做0xff;(b)jpeg文件中,一個字(16位)的存儲是采用了motorola格式(big-endian),而不是我們常用的intel格式(little-endian)。因此,如果需要的話,請在處理之間進行依次高低字節(jié)的轉(zhuǎn)換。(2)讀取huffman表在標記碼dht之后,包含了一個或者多個huffman表(通常是4個表)。(3)構(gòu)建huffman樹讀取到huffman表的數(shù)據(jù)之后,就需要構(gòu)建huffman樹了。其具體規(guī)則如下(a)第一個編碼的數(shù)字必定為0;如果第一個編碼的位數(shù)為1,就被編碼為0;如果第一個編碼的位數(shù)為2,就被編碼為00;如果第一個編碼的位數(shù)為3,就被編碼為000…(b)從第二個編碼開始,如果它和它前面編碼具有相同的位數(shù),則當前編碼是它前面的編碼加1;如果它的編碼位數(shù)比它前面的編碼位數(shù)大,則當前編碼時它前面的編碼加1之后再在后面添加若干個0,直到滿足編碼位數(shù)的長度為止。(4)dc系數(shù)的huffman解碼dc系數(shù)是以(a,b)的中間形式進行編碼的。其中的a代表了b的二進制 編碼位數(shù),b則利用vli進行編碼。(5)ac系數(shù)的huffman解碼通過查找ac系數(shù)的huffman編碼表,進行解碼,我們得到(a,b)的數(shù)據(jù)對,其中的a代表了0的個數(shù),而b則代表了后面數(shù)據(jù)的位數(shù)。讀取b位二進制數(shù)據(jù),進行譯碼,我們就得到了ac系數(shù)的值。(6)反量化在譯碼得到了8*8的系數(shù)矩陣之后,我們需要進行反量化工作。該步驟,就是將前一個步驟得到的8*8系數(shù)矩陣分別乘以8*8的量化矩陣即可。(7)反zig-zag掃描jpeg編碼過程中,為了編碼方便,采用了zig-zag掃描,因此,這里需要進行反zig-zag掃描,重新排列8*8的反量化系數(shù)矩陣。反zig-zag掃描的輸入時8*8矩陣,輸出依然是8*8矩陣,只不過,數(shù)據(jù)的排列方式有所不同而已。(8)dct逆變換dct變換,將原始圖像變換到頻域,而dct逆變換,就是要將數(shù)據(jù)從頻域變換回時域。dct逆變換的計算公式為:其中,當u,v=0時,當u,v≠0時,c(u),c(v)=1(9)顏色模式轉(zhuǎn)換bmp圖片是以rgb顏色空間進行保存的,因此,將jpeg解碼為bmp必須進行顏色模式的轉(zhuǎn)換。另外,由于dct要求的定義域?qū)ΨQ,所以,在編碼的時候?qū)gb的數(shù)值范圍從[0,255]統(tǒng)一減去128,將數(shù)值范圍轉(zhuǎn)換到[-128,127]的范 圍內(nèi)。因此,解碼的時候,必須為每個顏色分量加上128。另外需要注意的是,通過解碼變換之后得到的rgb的值有可能超過255或者小于0;如果小于0,就截斷為0,如果大于255,就截取為255;基于上述原理,本發(fā)明提出了一種自動化檢驗jpeg圖片是否正常的方法,步驟如下:1.讀取jpeg圖片的數(shù)據(jù),其必須包括數(shù)據(jù)為:soi+dqt+dht+sofo+sos+壓縮數(shù)據(jù)+eoi當獲取圖片數(shù)據(jù)時,檢測到數(shù)據(jù)中這部分數(shù)據(jù)缺失或者此部分數(shù)據(jù)不正確則認為此圖片為不正常圖片,既可以將其歸為不正常圖片類,這樣就可以快速將不正常的圖片區(qū)分出來。如圖1所示,下面對這些標記位的檢驗做具體說明:(特別說明:具體順序101->102->(103,104,105,106)->107->108->109,其中的103,104,105,106這4個可以是亂序的);以下所有步驟只要出現(xiàn)錯誤就認為圖片不正常,既終止此后的操作,不再繼續(xù)往后檢驗。101讀取圖片數(shù)據(jù),圖片數(shù)據(jù)分為文件頭信息和文件信息;102在讀取的圖片文件頭信息中查找soi標記位,也就是ffd8數(shù)據(jù),若不存在則認為此圖片不正常,存在則表示此處為圖片文件的開始標記;103檢驗dqt量化表標記,查找ffdb標記位,該標記位后為2byte表示長度的數(shù)據(jù)(不含標記位),根據(jù)此長度,檢驗標記位后此長度的這段數(shù)據(jù),第1byte為精度及量化表id,高4位:精度,只有兩個可選值0和1,0表示8位;1表示16位,低4位:量化表id,取值范圍為0~3;再后面是表項,長度為64*(精度+1)byte。本標記段中,字段②可以重復出現(xiàn),表示多個量化表,但最多只能出現(xiàn)4次。dqt表示定義量化表,包含9個具體字段:①數(shù)據(jù)長度2字節(jié)字段①和多個字段②的總長度即不包括標記代碼,但包括本字段②量化表數(shù)據(jù)長度-2字節(jié)a)精度及量化表id1字節(jié)高4位:精度,只有兩個可選值0表示8位;1表示16位低4位:量化表id,取值范圍為0~3b)表項(64×(精度+1))字節(jié)一般地,qt表id為0時表示亮度量化表,qt表id為1時表示色度量化表。104檢驗dht量化表標記,查找ffc4標記位,標記位后為2byte表示長度的數(shù)據(jù)(不含標記位),根據(jù)此長度,檢驗標記位后此長度的這段數(shù)據(jù),第1byte為編碼表類型和表id,高4位:類型,只有兩個值可選0和1,0表示dc直流;1表示ac交流;低4位:哈夫曼表id,注意,dc表和ac表分開編碼。再后面數(shù)據(jù)長度為16+nbyte。本標記段中,字段②可以重復出現(xiàn)(一般4次),也可以只出現(xiàn)1次。dht定義哈夫曼表,包含2個具體字段:①數(shù)據(jù)長度2字節(jié)字段①和多個字段②的總長度即不包括標記代碼,但包括本字段②哈夫曼表數(shù)據(jù)長度-2字節(jié)a)表id和表類型1字節(jié)高4位:類型,只有兩個值可選0表示dc直流;1表示ac交流低4位:哈夫曼表id,注意,dc表和ac表分開編碼b)不同位數(shù)的碼字數(shù)量16字節(jié)c)編碼內(nèi)容16個不同位數(shù)的碼字數(shù)量之和(字節(jié))105檢驗sofo幀圖開始標記,查找ffc0標記位,包含9個具體字段,一一檢驗以下字段是否符合規(guī)則,若不符合則為不正常。sofo表示幀圖像開始包含9個具體字段:①數(shù)據(jù)長度2字節(jié)①~⑥六個字段的總長度即不包括標記代碼,但包括本字段②精度1字節(jié)每個數(shù)據(jù)樣本的位數(shù)通常是8位,一般軟件都不支持12位和16位③圖像高度2字節(jié)圖像高度(單位:像素),如果不支持dnl就必須>0④圖像寬度2字節(jié)圖像寬度(單位:像素),如果不支持dnl就必須>0⑤顏色分量數(shù)1字節(jié)只有3個數(shù)值可選1表示灰度圖;3表示ycrcb或yiq;4表示cmyk而jfif中使用ycrcb,故這里顏色分量數(shù)恒為3⑥顏色分量信息顏色分量數(shù)×3字節(jié)(通常為9字節(jié))a)顏色分量id1字節(jié)b)水平/垂直采樣因子1字節(jié)高4位:水平采樣因子低4位:垂直采樣因子c)量化表1字節(jié)當前分量使用的量化表的id本標記段中,字段⑥應該重復出現(xiàn),有多少個顏色分量(字段⑤),就出 現(xiàn)多少次(一般為3次)。說明:此例中ffc0字段長度為0x11,數(shù)據(jù)精度8,圖像高度0x0326,寬度0x0226,顏色組件數(shù)量為3(ycbcr/yiq彩色圖),顏色組件1:012202,01為組件編號,22表示該顏色的水平采樣系數(shù)2,垂直采樣系數(shù)2,量化表02顏色組件2:021101顏色組件3:031101jpg的mcu(minimuncodedunix最小編碼單元)是一個(hmax*8,vmax*8)的塊,所以此例中mcu的大小為16*16=256byte106檢驗sos幀圖開始標記,查找ffda標記位,包含2個具體字段,一一檢驗以下字段是否符合規(guī)則,若不符合則為不正常。sos表示掃描開始,包含2個具體字段:①數(shù)據(jù)長度2字節(jié)①~④兩個字段的總長度即不包括標記代碼,但包括本字段②顏色分量數(shù)1字節(jié)應該和sof中的字段⑤的值相同,即:1表示灰度圖是;3表示ycrcb或yiq;4表示cmyk。而jfif中使用ycrcb,故這里顏色分量數(shù)恒為3③顏色分量信息a)顏色分量id1字節(jié)b)直流/交流系數(shù)表號1字節(jié)高4位:直流分量使用的哈夫曼樹編號低4位:交流分量使用的哈夫曼樹編號④壓縮圖像數(shù)據(jù)a)譜選擇開始1字節(jié)固定值0x00b)譜選擇結(jié)束1字節(jié)固定值0x3fc)譜選擇1字節(jié)在基本jpeg中總為00本標記段中,字段③應該重復出現(xiàn),有多少個顏色分量(字段②),就出現(xiàn)多少次(一般為3次)。本段結(jié)束后,緊接著就是真正的圖像信息了。圖像信息直至遇到一個標記代碼就自動結(jié)束,一般就是以eoi標記表示結(jié)束。107檢驗eoi圖像結(jié)束,在讀取的圖片文件頭信息中查找eoi標記位,也就是ffd9數(shù)據(jù),若不存在則認為此圖片不正常,存在則表示此處為圖片文件的結(jié)束標記2.按照解碼步驟對圖片進行解碼108當解碼過程中某個步驟出現(xiàn)錯誤,不能完成解碼,則也認為圖片為不正常的圖片,將其歸到不正常圖片類中。109當上面所有步驟都正確的情況下,則認為此圖片為正常圖片,否則只要某一個步驟出錯則認為圖片不正常。當前第1頁12當前第1頁12