2017-10-18 118 views
2

我要在我的網站上顯示從別人的圖像服務器的一些圖片,但一些來自圖像服務器的圖像只能部分顯示像下面的圖片 enter image description here如何檢測jpg jpeg圖像文件是否損壞(不完整)?

圖像包括寬度和高度的信息,但僅顯示最高層圖像的一部分。如果我用Chrome v61打開圖像,它看起來像下面的圖像 enter image description here

Chrome v61顯示此顏色以呈現png圖像文件中的透明度,但它在jpg jpeg圖像文件中意味着什麼?

有沒有人知道如何檢測這種損壞(不完整)圖像?我正試圖避免在我的網站上顯示這種圖像。

+0

_「圖像服務器中的一些圖像只能部分顯示」_你能提供這種圖像的**文件鏈接**,以便我們檢查它的字節嗎? –

+0

該文件將與我上傳到問題中的文件相同.http://i.stack.imgur.com/dge40.jpg – JasonHsieh

+0

當您上傳到這些網站時,這些圖像更像是問題的「快照」 。我需要**原始問題文件**(檢查任何**壞字節**)。如果我簡單地檢查一下'i.stack.imgur'圖像,那麼所有這些數據都會告訴我,這張Jpeg圖片有很多灰色和白色方塊(可能使用像Photoshop這樣的圖像編輯工具)。我試圖看看是否可以從服務器發送的確切數據**中恢復完整映像。 –

回答

1

如果您需要一個「編程」方法而不是@MarkSetchell建議的命令行方法,您可以使用幾乎任何編程語言爲此創建一個非常快速的測試。 請注意,這隻會發現你在問題中提到的那種截斷腐敗。 Mark的方法對於發現一般腐敗可能更可靠。

如我們所知,任何JPEG文件或流都是根據JPEG Interchange Format寫的。這意味着它們必須以SOI(圖像開始)標記(兩個字節0xFF, 0xD8)開始,並以EOI(圖像結束)標記(兩個字節,0xFF, 0xD9)結束。這兩個標記將不會在JPEG文件/流的其他地方找到。

如果您首先通過檢查前兩個字節並匹配SOI標記將文件標識爲JPEG,則可以跳到末尾並向後搜索EOI標記。最有可能的是,這可能是最後兩個字節,或者根本找不到它們。但是做一個搜索可能會更安全(可能是有限的長度),因爲我認爲在EOI之後可能會將應用程序特定的數據放在JPEG文件中(有人,如果我錯了,請糾正我)。

+0

謝謝mate.Is there任何方式,我可以識別瀏覽器JavaScript上損壞的JPG? – JasonHsieh

+0

@JasonHsieh當然,如果您可以訪問*壓縮的*圖像數據,只需按照上面概述的步驟操作即可。如果你需要編寫代碼的幫助,我不是那個。詢問有關該任務的特定新問題,並確保包含迄今爲止已嘗試的內容。 – haraldK

+0

一旦達到EOI標記,JPEG流就結束了。從理論上講,數據可以在之後進行,但編碼器如何流式傳輸是不可預測的。 – user3344003

1

我創建了一個JPEG,以測試這個使用ImageMagick的如下:

convert -size 1024x768 gradient: image.jpg 

,這是14KB。您的圖片看起來是不完整的,所以我砍掉一切3KB後是這樣的:

dd if=image.jpg bs=3000 count=1 > corrupt.jpg 

現在,如果我跑ImageMagick的identify命令和放棄stdout,只保留stderr,我得到:

identify -verbose corrupt.jpg > /dev/null 

樣本輸出

identify: Premature end of JPEG file `corrupt.jpg' @ warning/jpeg.c/JPEGWarningHandler/364. 
identify: Corrupt JPEG data: premature end of data segment `corrupt.jpg' @ warning/jpeg.c/JPEGWarningHandler/364. 

或者,你可以拋棄stderr過,只是看看退出代碼(0 =成功,別的=錯誤):

identify -regard-warnings -verbose corrupt.jpg > /dev/null 2>&1 
echo $? 
1 

而對於一個完整的圖像:

identify -regard-warnings -verbose image.jpg > /dev/null 2>&1 
echo $? 
0 

ImageMagick的安裝在大多數Linux發行版上,可用於macOS/OSX和Windows。

相關問題