内存不足Image.FromFile

时间:2010-10-03 01:05:05

标签: c# image c#-4.0 out-of-memory

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

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

7 个答案:

答案 0 :(得分:29)

Image.FromFile文档中,如果出现OutOfMemoryException,则可以抛出:

  

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

     

-OR -

     

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

检查图像格式。

此外,如果要在加载图像后立即关闭流,必须制作图像的副本。看看here。 GDI +必须在图像的生命周期内保持流打开。

答案 1 :(得分:7)

第一个错误:

if (File.Exists())

文件系统是易失性的,因此对您的文件的访问可能会在if条件行和后续行之间发生变化。不仅如此,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 :(得分: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);

答案 3 :(得分:2)

我有同样的问题,图像或位图的内存异常,我尝试调整大小,在面板和图片框上绘制它。我有可用的内存,所以在我的情况下,例外是一个红色的鲱鱼。

经过几个小时的踢PC后,我发现它是一个没有关闭流的第三方DLL。一些'writeline'调试可能有助于检查你是否真的有可用的内存:

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

答案 4 :(得分:1)

见Hans Passant的this reply

  在.NET出现之前,GDI +写了很长一段时间。 SDK   它的包装器是用C ++编写的。为了保持兼容,它不能   使用例外。报告错误条件包含错误代码。那   从来没有很好地扩展,GDI +只有20个错误代码。那不是很多   如此庞大的一大堆代码。

     

Status :: OutOfMemory错误代码被重载意味着不同   的东西。有时它确实意味着内存不足,无法分配   足够的空间来存储位图位。可悲的是,不知道那是怎么回事   发生了同样的错误报告图像文件格式问题   码。没有可以更准确的专用错误代码   我想是形容它。

答案 5 :(得分:0)

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

enter image description here

答案 6 :(得分:0)

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