为什么会出现内存不足错误?谢谢
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
在Image.FromFile
文档中,如果出现以下情况,可以抛出Image.FromFile
:
该文件的图像格式无效。
-或-
[GDI +不支持文件的像素格式。
检查图像格式。
此外,如果要在加载图像后立即关闭流,则必须复制图像。看一下OutOfMemoryException
。 GDI +必须在图像的生命周期内保持流打开。
第一个错误:
here
文件系统是易失性的,因此可以在带有if条件的行和后面的行之间更改对文件的访问。不仅如此,File.Exists()可能返回true,但是如果您对文件缺乏安全性权限或文件已经被锁定,则FileStream仍可能引发异常。
相反,正确的处理方法是使用try / catch块。将开发时间投入到异常处理程序中,因为无论如何您都必须编写该代码。
第二个错误:
if (File.Exists())
此行必须位于finally块内,否则您可能会留下打开的文件句柄。我通常建议使用fs.Close();
块来确保正确处理这种资源,但是由于您已经需要try / catch,因此可以改用如下代码:
using
您不能将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
我有一个相同的问题,图像或位图的内存不足异常,我尝试调整大小,将其画在面板和图片框上,很多。我有可用的内存,所以在我的情况下,异常情况有点像是鲱鱼。
踢了几小时的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);
请参阅汉斯·帕桑特的proc = Process.GetCurrentProcess();
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);
:
GDI +是在.NET出现之前写了很长时间。 SDK包装器是用C ++编写的。为了使其兼容,它不能使用异常。错误条件用错误代码报告。那永远无法很好地扩展,GDI +只有20个错误代码。那不算什么如此大的代码块。
状态:: OutOfMemory错误代码被重载以表示不同东西。有时确实确实意味着内存不足,无法分配足够的空间来存储位图位。可悲的是,不知道如何发生此错误报告了图像文件格式问题码。没有专用的错误代码可以更准确地我想描述一下。
取消选中文件属性中的this reply-这为我解决了问题。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xRHFzUi5wbmcifQ==” alt =“在此处输入图像描述”>
请确保已关闭所有文件,然后再次打开它们。它可能是仍打开的文件之一。