2010-08-20 69 views
2

我寫了一個代碼,它保存了一些png格式的位圖(使用bitmap.Save()方法)。但由於某些未知原因,某些圖像保存爲損壞的PNG,所以Photoshop無法打開它們。 我需要在我的代碼中檢測這些png,而不是在photoshop中逐一打開它們。如何以編程方式檢測png文件是否使用c#.NET損壞?

任何人都可以幫助我嗎? 有什麼方法可以讀取創建的png並檢查它是否損壞?

+2

由於是0字節,或者因爲它們包含一種格式但使用另一種格式的文件擴展名,所以我有時會損壞圖像。首先檢查這兩個標準,以確保。 (在你花費大量時間在可能避免的代碼之前)。只是一個建議。 – JYelton 2010-08-20 15:43:04

+0

這些保存的PNG文件是否在除Photoshop之外的任何查看器中打開?如果文件真的被損壞,C#庫中的圖片加載器將不會打開這些文件。您可以嘗試保存後立即打開文件。 – progo 2010-08-20 15:44:14

+1

我應該提到Irfanview(http://www.irfanview.com)(一個輕量級的圖像查看器應用程序)會在打開一種格式的文件時通知您,但指定了不正確的擴展名並提供更改。 – JYelton 2010-08-20 15:48:24

回答

1

嘗試並將文件讀回C#並捕獲相應的異常是有錯誤的(儘管您沒有指定腐敗形式 - 例如空白文件並不真正損壞,它只是空白!)

+0

我不認爲零長度文件是一個有效的PNG。 – recursive 2010-08-20 17:47:05

+0

這也不是一個腐敗的PNG。這只是不是一個PNG :) – Rushyo 2010-08-21 11:18:50

3

當您完成後,您是否確保正確關閉您的流?我認爲Bitmap.Save()極不可能導致PNG損壞,或者Photoshop無法讀取由.NET創建的任何PNG。

最簡單的嘗試就是立即在.NET中加載它。我會試圖弄清楚爲什麼會發生這種情況 - 什麼是特別腐敗的?

+0

謝謝你。我不知道它受到了什麼損害。但我試過 Image img = Image.FromFile(inputFile); 位圖newImage = new Bitmap(inputFile); bool validImage = img.RawFormat.Equals(ImageFormat.Png); 他們沒有任何錯誤!有沒有其他的方法來加載圖像? – user426490 2010-08-20 17:04:15

+0

加載後,你可以做些什麼嗎?檢查它的高度和寬度 - 將一部分像素與原始像素進行比較。需要檢查的一件事是,您可以使用WPF編解碼器加載它們 - 它們對損壞的文件非常敏感 - 如果加載它,它可能不會損壞。如果Windows Vista顯示它的縮略圖,它可能沒有損壞(損壞的PNG可能是一個病毒矢量,因此它們將不會在資源管理器中對其進行解碼,除非它是完美的) – 2010-08-20 19:27:49

1

我會嘗試讀取文件,然後檢查標題並查看是否存在所有必需的「塊」(IHDR,PLTE,IDAT和IEND)幷包含合理的數據。

+0

您能否給我發送一個鏈接到一個好的PNG規範文檔。我無法知道每個「大塊」應該在哪個地址出現,所以不知道如何檢查它們?!!非常感謝您的幫助。 – user426490 2010-08-20 17:06:47

+0

有關規範,請參見http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html。你可能想看看第3節和第4.1節。每個塊的開始沒有預定義的地址,但可以使用「長度」字段遍歷它們(請參閱第3節)。 – Tadmas 2010-08-20 18:39:57

0

Image.FromFile將拋出一個OutOfMemoryException如果它不能理解文件的格式。這讓我覺得這是一個奇怪的選擇,但是經驗測試和文檔都認爲這是它所拋出的異常。

參見Image.FromFile Method (String) on the MSDN

+0

我已經試過這些,沒有引發任何異常! Image img = Image.FromFile(inputFile); 位圖newImage = new Bitmap(inputFile); bool validImage = img.RawFormat.Equals(ImageFormat.Png); – user426490 2010-08-20 17:05:22

0

PNG format允許不同的壓縮,過濾和隔行掃描方法。你有沒有意識到更新的方法的舊版本的Photoshop?

檢查兩個PNG文件的標題可能很有用:一個加載,一個不加載。

相關問題