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

时间:2011-12-01 14:05:32

标签: c# .net wpf

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

我正在创建一个图像浏览器,尝试显示可移动驱动器上所有图像的预览。可能有很多文件不是​​图像,并且每个文件都有一个例外,看起来效率有点低,但我想不出一种不容易出错的方法。

有什么建议吗?

谢谢, 标记

4 个答案:

答案 0 :(得分:3)

我最近问了一个非常相似的问题并得到了一个很好的答案here

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

然后你必须阅读Validate image from file in C#

Getting image dimensions without reading the entire file

答案 3 :(得分:-1)

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

这在生产代码中很有效。