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

最后发布: 2011-12-01 14:05:32


问题

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

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

有什么建议?

谢谢,马克

c# .net wpf
回答

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

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

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

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

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

编辑:我也包裹这个功能集成到一个类,你可以复制粘贴到自己的项目在这里


回答

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

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


回答

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

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

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


回答

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

这在生产代码中很有效。