8位PNG上的OutOfMemory异常

时间:2018-03-27 07:08:15

标签: c# wpf out-of-memory png bitmapimage

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

更让人感到奇怪的是,如果我在使用8位PNG之前首次运行(即添加到StackPanel)32位PNG,那么程序运行正常而没有OutOfMemory异常,这只会得到如果它是8位PNG是第一个要添加到StackPanel的图像,则抛出。

这看似没有意义吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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