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.中工作得很好

更新:

事实上,我找到了这个工作的原因,但忘记了发布它。这与将图像转换为位图有关,而不是如果我记得的话,只尝试克隆原始图像。

C#映像.克隆内存不足异常

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(),否则将不会释放非托管资源。我想知道你到底在这里创作了多少张图片——几百张?成千上万?