2010-10-03 74 views
15

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

if (File.Exists(photoURI)) 
{ 
    FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read); 
    Image img = Image.FromStream(fs); 
    fs.Close(); 
} 
+0

也许图像太大?你试图加载什么? – schnaader 2010-10-03 01:11:16

+0

一张图片,其唯一的156KB – xscape 2010-10-03 01:12:15

+0

您是否打开任何其他图片?什么格式的图像? – JoshD 2010-10-03 01:14:25

回答

28

Image.FromFile文档,一个OutOfMemoryException可抛出如果:

该文件没有有效的图像格式。

- 或 -

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

检查您的图像格式。

此外,如果您想在加载图像后立即关闭流,您必须必须复制图像。看看here。 GDI +必须在图像的整个生命周期内保持数据流畅通。

+0

其.png文件格式 – xscape 2010-10-03 01:26:19

+1

然后,它是像素格式。 – 2010-10-03 01:30:42

+0

尝试在另一个应用程序中打开图像,并用不同的像素格式保存它。 – 2010-10-03 01:57:00

7

的第一个错误:

if (File.Exists()) 

文件系统是挥发性的,所以访问您的文件可以用你的,如果条件和线下的线之间改变英寸不仅如此,File.Exists()可能会返回true,但如果文件缺少安全权限或者它已被锁定,则FileStream仍可能会引发异常。

相反,正确的方法来处理这是一个try/catch块。把你的开发时间放在异常处理程序上,因为你必须编写代码。

第二个错误:

fs.Close(); 

此行必须是在finally块,或者你要离开打开的文件句柄躺在附近的潜力。我通常建议using块,以确保这种资源的妥善处理,但既然你已经需要try/catch语句,你可以用这样的代码来代替:

Image img = null; 
FileStream fs = null; 
try 
{ 
    fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);  
    img = Image.FromStream(fs);  
} 
finally 
{ 
    fs.Close(); 
} 
+2

如果您想要使用过去的图像,则无法关闭流。看看[这里](http://stackoverflow.com/questions/3661799/file-delete-failing-when-image-fromfile-was-called-prior-it-despite-making-copy/3661892#3661892)。 – 2010-10-03 01:28:10

+0

在这种情况下,我倾向于用自己的IDisposable实现将其包装在一个类中,该实现的行为更直观。 – 2010-10-03 01:35:57

+0

fs?.Close()适用于c#6及更高版本。 – 2015-10-16 08:11:18

2

我有同样的问题,图像或位图的内存不足例外,我试图调整大小,在面板和图片框,绘画它很多。我有可用的记忆,所以在我的例子中,这个例外是一个红鲱鱼。

经过数小时的PC踢我发现它是一个第三方DLL没有关闭流。有些“的WriteLine”调试,可能是有用的检查您是否也确实有可用内存:

proc = Process.GetCurrentProcess(); 
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64); 
+0

,肯定给了我一个检查文件的提示,打开导致这个问题的提示 - 在Process Explorer中使用Find Handle/DLL显示它们有打开的句柄通过系统进程 - 我不得不手动关闭手柄(好吧,我绝对不知道是什么让他们 - 如果我知道我一定会关闭它们),问题就消失了 – 2014-10-30 15:39:01

3

不能使用Image.FromStream为您的文件,而必须使用解码的TiffBitmapDecoder文件。从MSDN示例代码:

// 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

由Hans帕桑特见this reply

GDI +写很长一段时间之前,.NET曾经来到身边。 SDK的 包装是用C++编写的。为了保持它的兼容性,它不能使用例外情况 。错误情况报告了错误代码。 从来不会很好地扩展,GDI +只有20个错误代码。这对于 这么大的代码块来说并不多。

Status :: OutOfMemory错误代码被重载,意味着不同的 的东西。有时它确实意味着内存不足,它不能分配足够的空间来存储位图位。可悲的是,不知道 是怎么发生的,图像文件格式问题是由相同的错误 代码报告的。我想,没有专门的错误代码可以更精确地描述它。

0

取消选中文件属性中的Encrypt contents to secure data - 这解决了我的问题。

enter image description here