2014-01-16 114 views
1

我們有一些遺留的代碼有一些奇怪的習慣做法。你不能真正相信文件擴展名來知道它是什麼類型的文件。一個很好的例子就是jpgs實際上是tifs。如何確定System.Drawing.Bitmap在嘗試打開之前是否可以打開文件?

有可能是其他複雜的,所以我不能指望什麼,但文件的數據本身告訴我,如果可以處理圖像。現在我已經將它封裝在try/catch中,但我不喜歡使用異常來控制流量。

try 
{ 
    using (Bitmap current = (Bitmap)Bitmap.FromFile(file)) 
    { 
     // Use current 
    } 
} 
catch 
{ 
    // Must not be an image file 
} 

我們無法更改遺留代碼以使其有意義。有沒有比這更好的方式知道file是一個圖像?

回答

0

這可能聽起來愚蠢的,但打開的位圖是BMP或衍生工具

你能嘗試檢查文件的擴展任何這些擴展的文件(PNG,JPEG等)?

+0

嗯......我認爲問題的描述表明這是不可能的。 – DonBoitnott

0

首先,您可能希望使用Image.FromFile而不是Bitmap.FromFile

真的沒有簡單的方法來做你想問什麼。 FromFile將委託給GDI +,並且沒有辦法知道GDI +是否會喜歡該文件,除非您實際嘗試打開它。

您可以嘗試write code to do some basic sanity check the headers of all the image types you want to support。但最後,頭文件仍然有效,但文件本身將會損壞。而且,您已經爲處理圖像標題的代碼中的錯誤添加了一塊新的複雜性和可能的​​向量。

我認爲這實際上是一個例外情況,而不是流控制使用異常的例子。如果一個你認爲是圖像的文件不是,那是個例外。

+0

爲什麼使用'Image.FromFile'?有什麼不同? –

+0

'FromFile'在'Image'上定義,不會被Bitmap覆蓋 - Bitmap.FromFile存在的唯一原因是Bitmap是Image的一個子類。我懷疑這就是爲什麼來自MSDN的例子通常也顯示'Image.FromFile'。 –

+0

沒有區別。你的解釋實際上是不合理的。 – DonBoitnott

相關問題