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

本文关键字:格式 像素 图像 不支持 方式 编程 检测 转换 | 更新日期: 2023-09-27 18:28:00

当我在首次出现异常的情况下调试WPF应用程序时,我得到了很多带有消息"不支持像素格式"的NotSupportedException。如果我忽略了这个异常,图像会正常工作,但我无论如何都想修复它们,这样我就有机会查看其他第一次出现的异常。

目前,我正在查看调用堆栈以找出文件名,使用图像编辑器手动转换它,并重新启动调试以获取下一个文件名。然而,我想知道我是否可以用一个小型控制台应用程序自动检测这些图像,并将其转换为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可以调用处理图像的代码,因此无需再次循环转换后的文件。