为什么会出现内存不足错误?谢谢内存不足Image.FromFile
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
为什么会出现内存不足错误?谢谢内存不足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 +不支持该文件的像素格式。
检查您的图像格式。
此外,如果您想在加载图像后立即关闭流,您必须必须复制图像。看看here。 GDI +必须在图像的整个生命周期内保持数据流畅通。
其.png文件格式 – xscape 2010-10-03 01:26:19
然后,它是像素格式。 – 2010-10-03 01:30:42
尝试在另一个应用程序中打开图像,并用不同的像素格式保存它。 – 2010-10-03 01:57:00
的第一个错误:
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();
}
如果您想要使用过去的图像,则无法关闭流。看看[这里](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
在这种情况下,我倾向于用自己的IDisposable实现将其包装在一个类中,该实现的行为更直观。 – 2010-10-03 01:35:57
fs?.Close()适用于c#6及更高版本。 – 2015-10-16 08:11:18
我有同样的问题,图像或位图的内存不足例外,我试图调整大小,在面板和图片框,绘画它很多。我有可用的记忆,所以在我的例子中,这个例外是一个红鲱鱼。
经过数小时的PC踢我发现它是一个第三方DLL没有关闭流。有些“的WriteLine”调试,可能是有用的检查您是否也确实有可用内存:
proc = Process.GetCurrentProcess();
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);
,肯定给了我一个检查文件的提示,打开导致这个问题的提示 - 在Process Explorer中使用Find Handle/DLL显示它们有打开的句柄通过系统进程 - 我不得不手动关闭手柄(好吧,我绝对不知道是什么让他们 - 如果我知道我一定会关闭它们),问题就消失了 – 2014-10-30 15:39:01
不能使用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);
由Hans帕桑特见this reply:
GDI +写很长一段时间之前,.NET曾经来到身边。 SDK的 包装是用C++编写的。为了保持它的兼容性,它不能使用例外情况 。错误情况报告了错误代码。 从来不会很好地扩展,GDI +只有20个错误代码。这对于 这么大的代码块来说并不多。
Status :: OutOfMemory错误代码被重载,意味着不同的 的东西。有时它确实意味着内存不足,它不能分配足够的空间来存储位图位。可悲的是,不知道 是怎么发生的,图像文件格式问题是由相同的错误 代码报告的。我想,没有专门的错误代码可以更精确地描述它。
取消选中文件属性中的Encrypt contents to secure data
- 这解决了我的问题。
也许图像太大?你试图加载什么? – schnaader 2010-10-03 01:11:16
一张图片,其唯一的156KB – xscape 2010-10-03 01:12:15
您是否打开任何其他图片?什么格式的图像? – JoshD 2010-10-03 01:14:25