运行我的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;
}
答案 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对象不会被处理掉,或者它们被处理得太晚。