【问题标题】:Programmatically detect and convert “pixel format not supported” images以编程方式检测和转换“不支持的像素格式”图像
【发布时间】:2013-08-16 03:33:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您的意思是,除了编写一个加载图像、捕获异常然后转换图像的工具之外?你手动转换成什么格式,你用什么图像编辑器做的?
  • @EricLaw 我正在为图像知识而不是其他部分而苦苦挣扎。我阅读了一些参考资料,但不明白 WPF 对哪种格式感到满意/不满意,我只知道如果我在 Photoshop 中打开文件并保存,而不更改任何图像属性,问题就会消失。
  • 您能否发布一个引发此异常的示例图像?

标签: c# wpf


【解决方案1】:

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

【讨论】:

  • 感谢您的快速回答。也许我的问题不够清楚,我在图像处理部分有困难,即当图像在 XAML 中加载时,“try”子句中应该有什么来模拟相同的堆栈,以及“catch”中应该有什么将图像转换为 WPF 接受的格式?
  • @NS.X。我以为你在捕捉部分有问题。我写的几乎就是你需要的。 conversion program 是您手动使用的图像编辑器的名称。参数是文件名和进行转换所需的选项。至于图片加载部分,我想只创建一个Image 就可以了。
  • 我并不是要编写转换工具的脚本——我现在正在为此目的使用 Photoshop,它太重而无法循环使用。有没有办法纯粹在 .NET 代码中做到这一点?
  • @NS.X。 - 好吧,如果 .NET 无法原生读取文件格式,那么您将不得不使用其他一些程序(或者可能是第 3 方库)来进行转换。您需要这种方法因为 .NET 不支持所有格式。
  • .NET 可以读取它并且图像工作正常,但有一个第一次机会例外。
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2021-07-14
相关资源
最近更新 更多