System OutOfMemory但是我没有保存任何东西,所以怎么样?

时间:2017-02-26 21:35:21

标签: c#

运行我的C#控制台应用程序时出现了一个奇怪的错误。

//get trainingimages
var trainingImages = Directory.GetFiles(
   "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data",
   "*.jpg"
).ToList();

for (var i = 0; i < trainingImages.Count; i++)
{
   var image = Image.FromFile(trainingImages[i]);
   var vsImage = ConvertBitmap(new Bitmap(image));

   //cnvert to 2d array
   var imgArray = new int[vsImage.Width, vsImage.Height, 3];

   for (var j = 0; j < vsImage.Width; j++)
      for (var z = 0; z < vsImage.Height; z++)
      {
         var p = vsImage.GetPixel(j, z);
         imgArray[j, z, 0] = p.R;
         imgArray[j, z, 1] = p.G;
         imgArray[j, z, 2] = p.B;
      }
}

我得到运行时异常:

  

System.Drawing.dll中出现未处理的“System.OutOfMemoryException”类型异常

     

其他信息:内存不足。

但是我按照图像做这个图像,所以我很困惑我的逻辑部分是错误的。我的转换位图功能如下所示:

public static Bitmap ConvertBitmap(Bitmap image)
{
   // Convert other formats (including CMYK) to RGB.
   var newImage = new Bitmap(newWidth, newHeight);

   // Draws the image in the specified size with quality mode set to HighQuality
   using (var graphics = Graphics.FromImage(newImage))
   {
      graphics.DrawImage(image, 0, 0, newWidth, newHeight);
   }

   return newImage;
}

2 个答案:

答案 0 :(得分:2)

请记住,内存不足可能是因为您的图形对象的句柄用完了,而不仅仅是普通的旧RAM。

您需要处理每个IDisposable。在您的代码中,您需要为循环的每次迭代处理三个对象。

您的代码应如下所示:

//get trainingimages
var trainingImages = Directory.GetFiles(
   "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data",
   "*.jpg"
).ToList();

for (var i = 0; i < trainingImages.Count; i++)
{
    using (var image = Image.FromFile(trainingImages[i]))
    {
        using (var bm = new Bitmap(image))
        {
            using (var vsImage = ConvertBitmap(bm))
            {
                var imgArray = new int[vsImage.Width, vsImage.Height, 3];
                for (var j = 0; j < vsImage.Width; j++)
                {
                    for (var z = 0; z < vsImage.Height; z++)
                    {
                        var p = vsImage.GetPixel(j, z);
                        imgArray[j, z, 0] = p.R;
                        imgArray[j, z, 1] = p.G;
                        imgArray[j, z, 2] = p.B;
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

在我的某个应用中出现同样的问题。调用FromFile方法时使用using。 而不是:

 var image = Image.FromFile(trainingImages[i]);

使用:

using (var image = Image.FromFile(trainingImages[i]))
{
    using (var bitmap = new Bitmap(image))
    {
        using (var vsImage = ConvertBitmap(bitmap))
        {
            //cnvert to 2d array
            var imgArray = new int[vsImage.Width, vsImage.Height, 3];

            for (var j = 0; j < vsImage.Width; j++)
                for (var z = 0; z < vsImage.Height; z++)
                {
                    var p = vsImage.GetPixel(j, z);
                    imgArray[j, z, 0] = p.R;
                    imgArray[j, z, 1] = p.G;
                    imgArray[j, z, 2] = p.B;
                }
        }
    }
}

这就是为什么你得到OutOfMemory异常的原因,因为Image对象不会被处理掉,或者它们被处理得太晚。