C#映像.克隆内存不足异常
本文关键字:内存不足 异常 映像 | 更新日期: 2023-09-27 17:47:25
为什么我会出现内存不足异常?
所以这在C#中第一次通过就死了
splitBitmaps.Add(neededImage.Clone(rectDimensions,neededImage.PixelFormat))
其中splitBitmaps是List<位图>但这在VB中至少可以进行4次迭代:
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));
}
neededImage是一个位图。
我在intarweb上找不到任何有用的答案,尤其是不知道为什么它在VB.中工作得很好
更新:
事实上,我找到了这个工作的原因,但忘记了发布它。这与将图像转换为位图有关,而不是如果我记得的话,只尝试克隆原始图像。
Clone()也可能在矩形中指定的坐标超出位图边界时抛出内存不足异常。它不会自动为您剪辑它们。
我发现我正在使用Image.Clone裁剪位图,裁剪的宽度超出了原始图像的边界。这会导致内存不足错误。看起来有点奇怪,但值得知道。
当我尝试使用Clone()方法更改位图的像素格式时,我也遇到了这个问题。如果有内存的话,我试图将一个24bpp的位图转换为8位索引格式,天真地希望bitmap类能神奇地处理调色板的创建等等。显然不是:-/
这是一个范围,但我经常发现,如果直接从磁盘中提取图像,最好将它们复制到一个新的位图中,并处理磁盘绑定的图像。我看到这样做在内存消耗方面有了很大的改善
Dave M.也有钱。。。完成后一定要处理掉。
我最近很难弄清楚这一点——上面的答案是正确的。解决这个问题的关键是确保矩形实际上在图像的边界内。请参阅我如何解决此问题的示例。
简而言之,检查要克隆的区域是否在图像区域之外。
int totalWidth = rect.Left + rect.Width; //think -the same as Right property
int allowableWidth = localImage.Width - rect.Left;
int finalWidth = 0;
if (totalWidth > allowableWidth){
finalWidth = allowableWidth;
} else {
finalWidth = totalWidth;
}
rect.Width = finalWidth;
int totalHeight = rect.Top + rect.Height; //think same as Bottom property
int allowableHeight = localImage.Height - rect.Top;
int finalHeight = 0;
if (totalHeight > allowableHeight){
finalHeight = allowableHeight;
} else {
finalHeight = totalHeight;
}
rect.Height = finalHeight;
cropped = ((Bitmap)localImage).Clone(rect, System.Drawing.Imaging.PixelFormat.DontCare);
请确保在映像上正确调用.Dispose(),否则将不会释放非托管资源。我想知道你到底在这里创作了多少张图片——几百张?成千上万?