内存不足Image.FromFile

问题描述 投票:17回答:7

为什么会出现内存不足错误?谢谢

if (File.Exists(photoURI))
{
    FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
    Image img = Image.FromStream(fs);
    fs.Close();
}
c# image c#-4.0 out-of-memory
7个回答
29
投票

Image.FromFile文档中,如果出现以下情况,可以抛出Image.FromFile

该文件的图像格式无效。

-或-

[GDI +不支持文件的像素格式。

检查图像格式。

此外,如果要在加载图像后立即关闭流,则必须复制图像。看一下OutOfMemoryException。 GDI +必须在图像的生命周期内保持流打开。


7
投票

第一个错误:

here

文件系统是易失性的,因此可以在带有if条件的行和后面的行之间更改对文件的访问。不仅如此,File.Exists()可能返回true,但是如果您对文件缺乏安全性权限或文件已经被锁定,则FileStream仍可能引发异常。

相反,正确的处理方法是使用try / catch块。将开发时间投入到异常处理程序中,因为无论如何您都必须编写该代码。

第二个错误:

if (File.Exists())

此行必须位于finally块内,否则您可能会留下打开的文件句柄。我通常建议使用fs.Close(); 块来确保正确处理这种资源,但是由于您已经需要try / catch,因此可以改用如下代码:

using

3
投票

您不能将Image.FromStream用于文件,而必须使用Image img = null; FileStream fs = null; try { fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read); img = Image.FromStream(fs); } finally { fs.Close(); } 对该文件进行解码。来自MSDN的示例代码:

TiffBitmapDecoder

2
投票

我有一个相同的问题,图像或位图的内存不足异常,我尝试调整大小,将其画在面板和图片框上,很多。我有可用的内存,所以在我的情况下,异常情况有点像是鲱鱼。

踢了几小时的PC之后,我发现它是第三方DLL,没有关闭流。一些“写线”调试可能对检查您是否确实有可用内存有用:

// Open a Stream and decode a TIFF image
Stream imageStreamSource = new FileStream("tulipfarm.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];

// Draw the Image
Image myImage = new Image();
myImage.Source = bitmapSource;
myImage.Stretch = Stretch.None;
myImage.Margin = new Thickness(20);

1
投票

请参阅汉斯·帕桑特的proc = Process.GetCurrentProcess(); Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);

GDI +是在.NET出现之前写了很长时间。 SDK包装器是用C ++编写的。为了使其兼容,它不能使用异常。错误条件用错误代码报告。那永远无法很好地扩展,GDI +只有20个错误代码。那不算什么如此大的代码块。

状态:: OutOfMemory错误代码被重载以表示不同东西。有时确实确实意味着内存不足,无法分配足够的空间来存储位图位。可悲的是,不知道如何发生此错误报告了图像文件格式问题码。没有专用的错误代码可以更准确地我想描述一下。


0
投票

取消选中文件属性中的this reply-这为我解决了问题。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xRHFzUi5wbmcifQ==” alt =“在此处输入图像描述”>


0
投票

请确保已关闭所有文件,然后再次打开它们。它可能是仍打开的文件之一。

© www.soinside.com 2019 - 2024. All rights reserved.