[英]What is the best way to determine if WPF can load an image file?
有沒有辦法確定WPF是否能夠加載圖像文件而不嘗試構造BitmapImage並在失敗時捕獲異常?
我正在創建一個圖像瀏覽器,試圖顯示可移動驅動器上所有圖像的預覽。 可能有很多文件不是圖像,並且每個文件都有一個異常似乎效率低下但是我想不出一種不容易出錯的方法。
有什么建議?
謝謝,馬克
我最近問了一個非常相似的問題,並在這里得到了很好的答案。
基本上,您可以在用戶的計算機上找到BitmapImage可用於打開各種圖像格式的所有編解碼器。 從這些編解碼器中,您可以構建這些可以打開的文件擴展名列表。
然后,當您的程序嘗試打開文件時,請根據此列表檢查該文件的擴展名。
WPF使用WIC來處理圖像。 它包含一組處理常見圖像格式的核心編解碼器,我相信您可以從這里硬編碼這些格式的擴展。 WIC也是可擴展的,因此,例如,相機制造商可以將自定義圖像格式合並到WIC中。 上面答案中的代碼會在您的計算機中搜索這些額外的編解碼器,並為這些編解碼器提供相應的文件擴展名。
此方法假定文件擴展名對於文件是正確的。 在大多數情況下,這通常是一個公平的假設 - 即使Windows資源管理器很樂意假設這一點。 仍然,如果奇怪的流氓文件出現在擴展名似乎是圖像的位置,我會將BitmapImage構造包裝在try-catch中,但它仍然無法打開。
編輯:我也包裹這個功能集成到一個類,你可以復制粘貼到自己的項目在這里 。
WPF使用WIC,你想要的是在MSDN中的C ++中演示,但框架的反編譯源顯示IWICImagingFactory::CreateComponentEnumerator
甚至沒有暴露在框架的內部類中。
您最好的解決方案是創建一個支持的靜態擴展列表(WIC支持的格式在MSDN上 )並使用它。
我在StackOverflow的另一個問題中找到了答案,但我不記得我從中得到的問題。 無論如何,這里是我寫的一些代碼,基於該問題的答案之一:
public static string GetImageFileExtension( byte[] plateImage ) {
string imageFileExtension = String.Empty;
using ( Stream ms = new MemoryStream( plateImage ) ) {
BitmapDecoder decoder = BitmapDecoder.Create( ms, BitmapCreateOptions.None, BitmapCacheOption.None );
if ( decoder is BmpBitmapDecoder ) imageFileExtension = ".bmp";
else if ( decoder is GifBitmapDecoder ) imageFileExtension = ".gif";
else if ( decoder is IconBitmapDecoder ) imageFileExtension = ".ico";
else if ( decoder is JpegBitmapDecoder ) imageFileExtension = ".jpg";
else if ( decoder is PngBitmapDecoder ) imageFileExtension = ".png";
else if ( decoder is TiffBitmapDecoder ) imageFileExtension = ".tiff";
else if ( decoder is WmpBitmapDecoder ) imageFileExtension = ".wmp";
}
return imageFileExtension;
}
這在生產代碼中很有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.