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)
答案 0 :(得分:0)
您的8位PNG图片可能包含不正确的DPI
元数据。在某些时候,WPF渲染器会尝试缩放图像。由于错误DPI
,您会得到一个疯狂的大位图,在这种情况下对于32位应用程序来说太大了。
如果内存使用率确实稳定,我想图像缩放方法会在实际分配位图数据之前抛出OutOfMemoryException
。 E.g:
if (calculatedBitmapSize > int.MaxValue)
throw new OutOfMemoryException();