内存不足Image.FromFile

为什么我得到一个内存不足的错误? 谢谢

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

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

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

-要么-

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

检查你的图像格式。

另外,如果您想在加载图像后立即closuresstream,则必须复制图像。 看看这里 。 GDI +必须保持图像的生命周期的stream。

第一个错误:

 if (File.Exists()) 

文件系统是不稳定的,因此对你的文件的访问可以在if条件的行和下面的行之间进行改变。 不仅如此,File.Exists()可能返回true,但是如果文件缺less安全权限或者文件已经被locking,FileStream仍然会抛出exception。

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

第二个错误:

 fs.Close(); 

这条线必须在最后一个块内,否则你可能会留下躺着的文件句柄。 我通常推荐一个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(); } 

您不能将Image.FromStream用于您的文件,而必须使用TiffBitmapDecoder对文件进行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); 

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

踢了几个小时的电脑后,我发现这是一个第三方DLL没有closuresstream。 一些'writeline'debugging可能有助于检查您是否确实拥有可用的内存:

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

见Hans Passant的回复 :

在.NET出现之前,GDI +已经写了很长一段时间了。 SDK的封装器是用C ++编写的。 为了保持兼容性,它不能使用exception。 错误条件报告了错误代码。 这从来不能很好地扩展,GDI +只有20个错误代码。 对于如此庞大的代码来说,这并不算什么。

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

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

在这里输入图像描述