加载高分辨率JPG时出现GDI +错误

时间:2017-12-27 10:52:22

标签: c# image jpeg gdi+

我在尝试通过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);

如果有人能帮忙解释,我们非常感谢

2 个答案:

答案 0 :(得分: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作为原始图像文件,即位图。

答案 1 :(得分:0)

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