2011-02-28 117 views
2

我有一個要求,我必須確定一張照片是否損壞,並相應地標記爲這樣。如何確定照片是否損壞?

另一件事,我需要確定一個圖像是否有錯誤的擴展名。我的意思是錯誤的擴展名是,有時我遇到了一張帶有jpg擴展名的照片,但是當我將這張照片加載到IrfanView中時,它報告照片的格式與擴展名不同。

我該如何在Delphi中做到這一點。

回答

13

我有一個要求,我必須確定一張照片是否損壞,並相應地標記爲這樣。

您可以嘗試一些東西,但對於某些文件格式(例如:BMP,JPEG在某種程度上),只有人類可以最終決定文件是否正常或損壞。最簡單的測試是簡單地將文件加載到相應的對象(TJpegImage,TPngObject等)中。如果您在加載時遇到異常,您肯定會損壞文件。不幸的是,如果沒有異常提出,你不能說這個文件沒有損壞。我已經看到損壞的JPEG文件加載到Delphi TImage中,並且可以用Windows的圖像查看器打開,但顯然已被人類觀察者破壞。使用BMP圖像更清晰:打開位圖,覆蓋文件中間的一些字節,然後在查看器中打開它。任何自動化系統如何告訴位圖中間的錯誤顏色位實際上是錯誤的?

另一件事,我需要的是要確定圖像是否有錯誤的擴展名。我的意思是錯誤的擴展名是,有時我遇到了一張帶有jpg擴展名的照片,但是當我將這張照片加載到IrfanView中時,它報告照片的格式與擴展名不同。

如何做一些相同的事情,試圖將文件加載到與其擴展名相對應的對象中,如果失敗,嘗試使用其他格式打開?這應該很容易。

或者,您可以調查圖像標題:大多數文件格式以短簽名開始,幾個字節。您可以查找所有圖像文件格式的文檔並找到簽名,或者只需打開大量文件並在前4個字節中查找圖案。因爲爲所有圖像文件格式尋找適當的文檔可能是一個挑戰,所以我會選擇第二種方法。

+0

同意,看起來好像第一部分(是這個圖像是否損壞?)可以被確定爲沒有找到第二個不會引發異常的格式。 – Argalatyr

+0

感謝您的信息。我也得出了同樣的結論,即幾乎不可能檢測出文件是否被破壞。 –

2

檢查文件是否損壞的唯一方法是嘗試讀取它,如文件格式中所述。將BMP加載爲帶有讀取BMP標頭,BMP數據等的BMP。有許多描述圖形文件格式的網頁。當然,如果你傳輸文件,並擔心傳輸後會損壞,然後用諸如CRC32之類的數據保存這些文件,甚至是加密的MD5或SHA1。然後在傳輸之後檢查計算的總和是否與原始相同。

在Delphi中有單元jpeg和類型TJPEGImageTBitmap。嘗試加載數據並檢查異常。對於其他格式有許多庫,只需查找所需的文件格式。

要檢查文件擴展名是否正確,請嘗試讀取文件的某些第一個字節,並使用一些圖形文件頭字典對其進行檢查。例如,GIF文件應以GIF開頭,BMP文件以BM開頭,在JPEG標頭中您將找到JFIF。我認爲unix實用程序file以這種方式工作。

2

由於您使用了術語「要求」,我懷疑您是爲某人工作,可能是合同。因此,請確保您在擔心代碼之前就明確要求。

IMO,您需要獲取測試用例的樣本。正如其他人所說,未能將文件作爲特定格式加載將是一次測試。但是,加載好的.jpg,但是底部的三分之一缺失呢?或者是一個加載好的.jpg,但在中間有一個錯誤發生在某處的上游(在相機,photoshop等等)上有綠色「靜態」線,但是處理恢復並恢復了?在這種情況下,.jpg可能真的有綠線。這是否被認爲是「腐敗」?這是你需要小心的地方,尤其是如果它是合同工。

+0

我們開發了一個用於從存儲卡中恢復丟失數據的實用程序。我們的大多數客戶都是攝影師(包括專業人士和業餘愛好者),現在他們要求我們建立一個設施來檢測恢復的文件是否損壞。 –

相關問題