【问题标题】:GDI+ error when loading a high resolution JPG加载高分辨率 JPG 时出现 GDI+ 错误
【发布时间】:2017-12-28 16:49:46
【问题描述】:

我在尝试通过 C# 加载 JPG 图像时遇到了常见的 GDI+ 错误。我不确定这是否是由于此 JPG (46495px*4536px) 的高分辨率,因为加载其他低分辨率 JPG 文件可以正常工作。问题 JPG 文件大小为 4696KB。

代码:

var newImage = Image.FromFile("demo.jpg"); //issue jpg

使用 Image.FromStream() API 时也失败了:

var stream = File.OpenRead("demo.jpg");

var image = Image.FromStream(stream);

如果有人能帮忙解释一下,不胜感激

【问题讨论】:

  • 您好,您收到的错误信息是什么?
  • 我怀疑您遇到了 GDI+/.NET 的限制,即即使在 64 位操作系统上,GC 堆上允许的最大对象大小也是 2GB。我没有足够的知识来给出答案,但汉斯·帕桑特本人在这个问题上读了一些有趣的书:How are Bitmaps stored in memory in .NET?What is the maximum resolution of C# .NET Bitmap?
  • 错误消息是:“GDI+ 发生一般错误”,errorCode 是 -2147467259。
  • Visual Studio 没有提示限制或任何内存不足问题。
  • 遗憾的是,实际上 GDI+ 返回的所有错误都是这样不伦不类的。

标签: c# image jpeg gdi+


【解决方案1】:

您需要可用的 RAM 来存储解压缩的图像位图

在 32 位显示器上,您将需要免费的 width * height * 4 + c 字节,其中 c 是未知的,具体取决于所使用的绘图类的实现。

示例

在您的具体情况下,计算如下:

46495 * 4536 * 4 + c = 843605280 bytes + c = 805mb + c

使用以下内容查看您的位图有多少内存可用。

包括对 VisualBasic dll 的引用:

using Microsoft.VisualBasic.Devices;

方法如下:

Console.Out.Write(new ComputerInfo().AvailablePhysicalMemory + "bytes free");

...或...

Console.Out.Write((ComputerInfo().AvailablePhysicalMemory / 1048576) + "mb free");

找c

要查找c,请在加载图像之前和之后使用上述方法。

通过成功加载多个图像并记录加载前后使用的内存。

通过比较加载不同大小的图像之前和之后使用的内存进行实验,同时考虑位图的大小,您会发现c 的近似值。

请注意,所有图像类型都会在内部转换为原始位图以供查看,无论它是存储为 .jpg、.png、.gif 还是其他格式。所以当我说 Bitmp 时,我指的不是扩展名 .bmp。相反,我在字面上将 bitmp 称为原始图像文件,即位图。

【讨论】:

  • 嗨,非常感谢您的详尽回答。应用上述方法查看可用内存。\r\n 结果:8191mb 可用。超过 805mb 的可用空间很多。所以在这种情况下,它似乎与 RAM 无关,不是吗?
【解决方案2】:

如果 GDI+ 不支持文件的像素格式,则会抛出“OutOfMemoryException”。

【讨论】:

  • 不是来自 Visual Studio 的“OutOfMemoryException”错误消息。它只是抛出“GDI+ 发生一般错误”并且 ErrorCode 是 -2147467259
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多