C# 8位PNG上的OutOfMemory异常

C# 8位PNG上的OutOfMemory异常,c#,wpf,out-of-memory,png,bitmapimage,C#,Wpf,Out Of Memory,Png,Bitmapimage,Visual Studio 2015 debug(x86)在8位PNG上抛出OutOfMemory异常,但在32位PNG上不抛出异常。如果我将debug改为(任意CPU),那么程序可以正常运行8位和32位。8位和原始32位PNG都是相同的图像,我使用Photoshop将原始32位转换为8位PNG。即使抛出OutOfMemory,任务管理器也不会反映任何内存问题(都低于100MB) 更奇怪的是,如果我在运行8位PNG之前先运行32位PNG(即添加到StackPanel),那么程序运行得很好,没有O

Visual Studio 2015 debug(x86)在8位PNG上抛出
OutOfMemory
异常,但在32位PNG上不抛出异常。如果我将debug改为(任意CPU),那么程序可以正常运行8位和32位。8位和原始32位PNG都是相同的图像,我使用Photoshop将原始32位转换为8位PNG。即使抛出OutOfMemory,任务管理器也不会反映任何内存问题(都低于100MB)

更奇怪的是,如果我在运行8位PNG之前先运行32位PNG(即添加到StackPanel),那么程序运行得很好,没有OutOfMemory异常,只有当8位PNG是第一个添加到StackPanel的图像时才会抛出

这似乎毫无意义

Image _img = new Image();
BitmapImage _bi = new BitmapImage(new Uri(_path, UriKind.Absolute));
_img.Source = _bi;
stackPanel.Children.Add(_img)

您的8位PNG图像可能具有不正确的DPI元数据。在某些情况下,WPF渲染器会尝试缩放图像。由于错误的
DPI
您会得到一个疯狂的大位图,在本例中,它对于32位应用程序来说太大了

如果内存使用情况确实稳定,我想图像缩放方法在实际分配位图数据之前会抛出
OutOfMemoryException
。例如:

if (calculatedBitmapSize > int.MaxValue)
    throw new OutOfMemoryException();

可能是8位映像已损坏。您是否尝试过重新创建/重新保存它,可能是使用不同的图像程序?图像的大小(尺寸)是多少。压缩的大小不是一个很大的帮助。PNG压缩在特定图像上非常好,问题可能在于图像尺寸。显示的图像是未压缩的。8位图像可以在其他程序中打开,并且有多个8位图像不能全部损坏,我确实单独尝试过。如果它被破坏,第二个问题也会抛出同样的异常,但事实并非如此。这是有趣的部分。32位(~450kb)和8位图像(~150kb)的图像大小都是1200x800。如果您可以提供可复制的示例(完整的xaml\C#代码+图像),则不会有任何影响。