C# 以编程方式检测和转换“;不支持像素格式”;图像

C# 以编程方式检测和转换“;不支持像素格式”;图像,c#,wpf,C#,Wpf,当我调试WPF应用程序并打开first chance exception时,我收到了大量的NotSupportedException,并显示消息“pixel format not supported”。如果我忽略了这个异常,这些图像就可以正常工作,但我还是想修复它们,这样我就有机会看到其他第一次出现的异常 目前,我正在查看callstack以确定文件名,使用图像编辑器手动转换文件名,然后重新启动调试以捕获下一个文件名。然而,我想知道我是否可以用一个小的控制台应用程序来自动检测这些图像,并将它们转

当我调试WPF应用程序并打开first chance exception时,我收到了大量的
NotSupportedException
,并显示消息“pixel format not supported”。如果我忽略了这个异常,这些图像就可以正常工作,但我还是想修复它们,这样我就有机会看到其他第一次出现的异常

目前,我正在查看callstack以确定文件名,使用图像编辑器手动转换文件名,然后重新启动调试以捕获下一个文件名。然而,我想知道我是否可以用一个小的控制台应用程序来自动检测这些图像,并将它们转换成WPF喜欢的格式


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

有多种文件格式—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
可以调用处理图像的代码,因此无需再次循环转换的文件。

您的意思是,除了编写加载图像的工具外,还可以捕获异常,然后转换图像?你手动转换成什么格式,你用什么图像编辑器?EricLaw我正在努力学习图像知识,而不是其他部分。我阅读了一些参考资料,但无法理解WPF喜欢/不喜欢的确切格式,我只知道如果我在Photoshop中打开文件并保存,而不更改任何图像属性,问题就会消失。你能发布一张引发此异常的示例图像吗?谢谢你的快速回答。也许我的问题不够清楚,我在图像处理部分遇到了困难,即当图像加载到XAML中时,“try”子句中应该包含什么来模拟相同的堆栈,以及“catch”中应该包含什么来将图像转换为WPF接受的格式?@NS.X。我以为你在接球方面有问题。我所写的正是你所需要的<代码>转换程序是手动使用的图像编辑器的名称。参数是文件名和进行转换所需的选项。至于图像加载部分,我想仅仅创建一个
图像就可以了。我不是想编写转换工具的脚本-我现在正在使用Photoshop来实现这个目的,它太重了,无法循环使用。有没有一种方法可以完全在.NET代码中执行此操作?@NS.X.-如果.NET不能以本机方式读取文件格式,那么您将不得不使用其他程序(或者第三方库)来进行转换。您需要这种方法,因为.NET不支持所有格式..NET可以读取它,图像工作正常,但有一个第一次机会例外。