【发布时间】:2017-02-28 16:52:22
【问题描述】:
运行我的 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;
}
【问题讨论】:
-
奇怪?我会说,这段代码预计会发生这种情况。建造一次性物品而不处置它们。用所有图像中的所有字节填充数组,如果有很多图像,这可能会占用大量内存。
-
嗯,我认为每当我退出循环时都会被处理掉。那么我将如何处理每张图片?
-
该错误可能表明您正在访问图像边界之外的内存位置。我将首先验证图像的宽度和高度是否有效。这些数字应该是标准图像尺寸。
-
“但我没有保存任何东西,所以如何”。 “内存”是指 RAM,而不是硬盘空间。这将取决于您拥有多少张大小的图像。 100 张 1000x1000 图像会消耗 100*1000*1000*3*4 = 1.2GB 的 RAM。 (这只是你的数组)。
-
@woofwoof 要么使用
using(那么一次性对象将在 using-block 的末尾进行处理)或手动处理对象。
标签: c#