System.Drawing.Image.FromFile()内存不足exception

我有一个图像上传和裁剪创build缩略图,我偶尔会得到内存溢出exception在下面的行:

Dim bm As Bitmap = System.Drawing.Image.FromFile(imageFile) 

错误的发生是微小的,非常罕见,但我总是想知道可能是什么原因造成的。 imageFilevariables只是一个Server.MapPath到图像的path。

我很好奇,如果有人曾经遇到这个问题,如果他们有什么想法可能会导致这个问题? 也许是图像的大小?

如果有必要,我可以发布代码和任何支持信息,但很想听听人们对此的意见。

值得一提的是,OutOfMemoryException并不总是表示内存不足,特别是在处理文件时。 我相信,如果出于某种原因用完了手柄,也会发生这种情况。

你完成了所有的位图处理吗? 这是否重复发生一个单一的图像?

如果这不是一个坏的图像文件,但实际上是Image.FromFile的正常问题,其中它使文件句柄保持打开状态,那么解决方法就是使用Image.FromStream代替。

 using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (Image original = Image.FromStream(fs)) { ... 

使用一个显式Dispose() ,一个using()语句或Image.FromFile图上将该值设置为null不能解决Image.FromFile的问题。

所以,如果你的App运行一段时间,并打开很多文件考虑使用Image.FromStream()来代替。

我今天遇到了同样的问题,同时创build一个文件夹的图像充满缩略图。 事实certificate,“内存不足”每次都发生在同一个点上。 当我看着要转换图像的文件夹时,我发现创build问题的文件是thumbs.db。 我添加了一些代码,以确保只有图像文件正在转换,并解决了问题。

我的代码基本上是

 For Each imageFile as FileInfo in fileList If imageFile.Extension = ".jpg" Or imageFile.Extension = ".gif" Then ...proceed with the conversion End If Next 

希望这可以帮助。

你也可以在阅读模式下打开它(如果你想同时在两个地方使用它)

  public Image OpenImage(string previewFile) { FileStream fs = new FileStream(previewFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); return Image.FromStream(fs); } 

我今天有一个类似的问题,当我试图resize的图像,然后裁剪,发生了什么是我用这个代码来调整图像大小。

 private static Image resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; int sourceHeight = imgToResize.Height; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)size.Width / (float)sourceWidth); nPercentH = ((float)size.Height / (float)sourceHeight); if (nPercentH < nPercentW) nPercent = nPercentH; else nPercent = nPercentW; int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap b = new Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage((Image)b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); g.Dispose(); return (Image)b; } 

然后这个作物的代码…

 private static Image cropImage(Image img, Rectangle cropArea) { Bitmap bmpImage = new Bitmap(img); Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); return (Image)(bmpCrop); } 

那么这就是我如何调用上面的代码…

 Image img = Image.FromFile(@"C:\Users\****\Pictures\image.jpg"); img = ImageHandler.ResizeImage(img, new Size(400, 300)); img = ImageHandler.CropImage(img, new Rectangle(0, 25, 400, 250)); long quality = 90; 

我不断收到错误的裁剪部分,resizer工作正常!

事实certificate,调整器内部发生的是在裁剪function中抛出错误。 经过调整的计算结果使得图像的实际尺寸变得像我通过的399而不是400。

所以,当我通过400作为作物的参数时,它试图裁剪一个宽度为400像素的399像素的图像,并抛出了内存不足的错误!

上面的大部分代码可以在http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resize

如果图像是图标,则需要不同的加载处理,如下一个function:

 public static Image loadImage(string imagePath) { Image loadedImage = null; if (!File.Exists(imagePath)) return loadedImage; try { FileInfo fileInfo = new FileInfo(imagePath); if (fileInfo.Extension.Equals(".jpg") || fileInfo.Extension.Equals(".jpeg") || fileInfo.Extension.Equals(".bmp") || fileInfo.Extension.Equals(".png") || fileInfo.Extension.Equals(".gif")) { loadedImage = Image.FromFile(imagePath); } else if (fileInfo.Extension.Equals(".ico")) { Bitmap aBitmap = Bitmap.FromHicon(new Icon(imagePath, new Size(200, 200)).Handle); loadedImage = ImageFuncs.ResizeImage(aBitmap, new Size(30, 30)); } } catch (Exception eLocal) { MessageBox.Show(imagePath + " loading error: " + eLocal.Message); } return loadedImage; } 

我用我写的将TIFF(s)转换为PDF(s)的实用程序遇到同样的问题。 通常我会在你的同一行上得到“内存不足”的错误。

 System.Drawing.Image.FromFile(imageFile) 

然后我发现这个错误只发生在文件扩展名为“.tiff”的情况下,并且在我用“.tif”扩展名重新命名后,

另外检查你是否还没有在别的地方打开同一个文件。 显然,当你打开一个文件两次(甚至用File.Open())OutOfMemoryException也被抛出…

我有同样的问题批处理Tiff文件。 大多数文件不会抛出exception,但很less有文件在ASP.NET 4.0中抛出“内存不足”exception。 我已经使用二进制数据来找出为什么只是less数文件,并在同一个文件夹。 它不能是ASP.NET ASPNET或NETWORK SERVICE帐户的权限问题,因为其他文件是工作文件。

我打开了iTextSharp.text.Image类,发现GetInstance()有很多重载的方法。 我已经解决了我的问题,使用下面的代码:注意:catch块将运行有问题的文件。

  iTextSharp.text.Image image = null; try { var imgStream = GetImageStream(path); image = iTextSharp.text.Image.GetInstance(imgStream); } catch { iTextSharp.text.pdf.RandomAccessFileOrArray ra = null; ra = new iTextSharp.text.pdf.RandomAccessFileOrArray(path); image = iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(ra, 1); if (ra != null) ra.Close(); }