确定WPF是否可以加载图像文件的最佳方法是什么?

有没有办法确定WPF是否能够加载图像文件而不尝试构造BitmapImage并在失败时捕获exception?

我正在创建一个图像浏览器,试图显示可移动驱动器上所有图像的预览。 可能有很多文件不是​​图像,并且每个文件都捕获exception似乎效率低下但是我想不出一种不容易出错的方法。

有什么建议?

谢谢,马克

我最近问了一个非常相似的问题,并在这里得到了很好的答案。

基本上,您可以在用户的​​计算机上找到BitmapImage可用于打开各种图像格式的所有编解码器。 从这些编解码器中,您可以构建这些可以打开的文件扩展名列表。

然后,当您的程序尝试打开文件时,请根据此列表检查该文件的扩展名。

WPF使用WIC来处理图像。 它包含一组处理常见图像格式的核心编解码器,我相信您可以从这里对这些扩展进行硬编码。 WIC也是可扩展的,因此,例如,相机制造商可以将自定义图像格式合并到WIC中。 上面的答案中的代码会在您的计算机中搜索这些额外的编解码器,并为这些编解码器提供相应的文件扩展名。

此方法假定文件扩展名对于文件是正确的。 在大多数情况下,这通常是一个公平的假设 – 即使Windows资源管理器很乐意假设这一点。 仍然,我会将BitmapImage结构包装在try-catch中,如果奇数流氓文件出现在扩展名显示为图像的位置,但它仍然无法打开。

编辑:我还将此function包装到一个类中,您可以将其复制粘贴到您自己的项目中。

WPF使用WIC,您想要的是在MSDN中的C ++中演示,但框架的反编译源显示IWICImagingFactory::CreateComponentEnumerator甚至没有在框架的内部类中公开。

您最好的解决方案是创建一个支持的静态扩展列表(WIC支持的格式在MSDN上 )并使用它。

首先,您可以尝试检查图像文件扩展名,以validation您的应用程序是否能够读取它。

然后你必须从C#中的文件中读取validation图像

这里获取图像尺寸而不读取整个文件

我在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; } 

这在生产代码中很有效。