为什么我出现内存不足错误?谢谢
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
答案 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
- 这解决了我的问题。
答案 6 :(得分:0)
在再次打开它们之前,请确保已关闭所有文件。它可能是仍打开的文件之一。