为什么我会出现内存不足异常?
所以这首次在C#中死掉了:
splitBitmaps.Add(neededImage.Clone(rectDimensions,neededImage.PixelFormat));
其中splitBitmaps是List
arlSplitBitmaps.Add(Image.Clone(rectDimensions,Image.PixelFormat))
其中arlSplitBitmaps是一个简单的数组列表.(是的,我在c#中试过arraylist)
这是完整的部分:
for (Int32 splitIndex = 0; splitIndex <= numberOfResultingImages - 1; splitIndex++) { Rectangle rectDimensions; if (splitIndex < numberOfResultingImages - 1) { rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, splitImageWidth, splitImageHeight); } else { rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, sourceImageWidth - (splitImageWidth * splitIndex), splitImageHeight); } splitBitmaps.Add(neededImage.Clone(rectDimensions, neededImage.PixelFormat));
}
aptImage顺便说一句就是Bitmap.
我在intarweb上找不到任何有用的答案,尤其不是为什么它在VB中运行得很好.
更新:
我实际上找到了这个工作的原因(但有点),但忘了发布它.它与将图像转换为位图有关,而不仅仅是在我记得的情况下尝试克隆原始图像.
当Rectangle中指定的坐标超出位图的边界时,Clone()也可能抛出Out of memory异常.它不会自动剪辑它们.
我发现我使用Image.Clone裁剪位图,宽度将裁剪超出原始图像的边界.这会导致内存不足错误.似乎有点奇怪,但可以了解.
当我尝试使用Clone()方法更改位图的像素格式时,我也得到了此信息。如果有内存可用,我试图将24 bpp位图转换为8位索引格式,天真地希望Bitmap类能够神奇地处理调色板创建等等。明显不是 :-/