c# - 8 位 PNG 上的 OutOfMemory 异常

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

Visual Studio 2015 调试 (x86) 在 8-bit-PNG 上引发 OutOfMemory 异常,但在 32-bit-PNG 上不会>。如果我将 debug 更改为(任何 CPU),则程序可以正常运行 8 位32 位 图像。 8 位和原始 32 位 PNG 都是相同的图像,我使用 Photoshop 将原始 32 位 PNG 转换为 8 位 PNG。即使抛出 OutOfMemory,任务管理器也不会反射(reflect)任何内存问题(均低于 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)

最佳答案

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

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

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

关于c# - 8 位 PNG 上的 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506401/

相关文章:

c# - 离线+在线数据库应用

c# - WinRT 是否等同于这些 .Net 文化方法?

c# - 从闪存中检索变量值

c# - Caliburn Micro 取消窗口从 ViewModel 关闭

.net - 我可以使用 WPF 窗口中的 XamlReader.Load 或 InitializeFromXaml 来进行窗口定义吗?

wpf - 窗口 GotFocus 事件未触发

python - 读取 block 中的 csv 文件时出现内存不足错误

c# - 如何从 C# 中的单个完整路径创建多个目录?

Android读取大型csv文件并将数据发送到服务器的最有效方法(不上传文件)

java - Java中的内存泄漏