1

当我调试带有第一次机会异常的 WPF 应用程序时,我收到了很多NotSupportedException“不支持像素格式”的消息。如果我忽略异常,图像工作得很好,但我还是想修复它们,所以我有机会查看其他第一次机会异常。

目前我正在查看调用堆栈以找出文件名,使用图像编辑器手动转换它,然后重新启动调试以捕获下一个。但是,我想知道是否可以使用小型控制台应用程序自动执行此操作,以检测此类图像并将它们转换为 WPF 满意的格式。

我已经阅读了一些参考资料,但由于图像知识有限,我无法理解 WPF 对这些图像的确切问题,或者我如何对其进行编程以检测这些图像,就好像它们是从 XAML 加载的一样,或者如何转换它们以编程方式转换为 WPF 满意的格式。

4

1 回答 1

3

有多种文件格式(PNG 就是其中一种),其中几种不同的图像格式存储在同一个文件中。在这种情况下,它是图像深度(每像素位数)。所以 .NET 可能正在做的是首先尝试以最常见的格式打开文件,当失败时,它会尝试不同的格式,直到找到可以工作的格式。

由于这是一个罕见的事件,因此明智的做法是尝试打开文件,然后捕获产生的异常并重试。

由于异常被引发并且(更重要的是)在图像创建代码中处理,因此您实际上无能为力。

您遇到了打开“第一次机会例外”的一大危险。你会得到很多这样的“错误”错误。此模式仅应用于您遇到的实际问题,当您不知道在哪里引发异常时。由于图像被成功读取,您并没有真正遇到错误情况。


如果 .NET 确实无法读取文件格式,那么您需要捕获异常并在处理程序中执行“一些明智的事情”:

foreach (string file in files)
{
    try
    {
        // Your code to process the image
        var image = Image.Fromfile(file);
    }
    catch (NotSupportedException ex)
    {
        var process = new Process();
        process.Exited += ExitedHandler;
        // Call other app to convert file
        string arguments = file + command line arguments necessary
        process.Start(conversion program, arguments);
    }

ExitedHandler可以调用处理图像的代码,因此无需再次遍历转换后的文件。

于 2013-08-15T18:28:52.807 回答