当前位置:  开发笔记 > 编程语言 > 正文

C#Image.Clone内存异常

如何解决《C#Image.Clone内存异常》经验,为你挑选了3个好方法。

为什么我会出现内存不足异常?

所以这首次在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)); 

}

aptImage顺便说一句就是Bitmap.

我在intarweb上找不到任何有用的答案,尤其不是为什么它在VB中运行得很好.

更新:

我实际上找到了这个工作的原因(但有点),但忘了发布它.它与将图像转换为位图有关,而不仅仅是在我记得的情况下尝试克隆原始图像.



1> Tomas Andrle..:

当Rectangle中指定的坐标超出位图的边界时,Clone()也可能抛出Out of memory异常.它不会自动剪辑它们.


只是一个快速注释,以防它不明显(一开始不是我):矩形构造函数的宽度和高度参数代表你想要的矩形的_area_,而不是右下角.防爆.在100x100图像上,如果你想要矩形(15,10)到(100,100),你需要新的`矩形(15,10,85,90)`.宽度=图像宽度-x(100-15 = 85),高度=图像高度-y(100-10 = 90).`Rectangle(15,10,100,100)`会给你一个内存不足的例外.

2> 小智..:

我发现我使用Image.Clone裁剪位图,宽度将裁剪超出原始图像的边界.这会导致内存不足错误.似乎有点奇怪,但可以了解.



3> Andy..:

当我尝试使用Clone()方法更改位图的像素格式时,我也得到了此信息。如果有内存可用,我试图将24 bpp位图转换为8位索引格式,天真地希望Bitmap类能够神奇地处理调色板创建等等。明显不是 :-/


对我来说,这是使用Windows 2003 Server和Windows 7或Windows 2008 Server之间的问题。在Windows 2003上使用某些PixelFormats克隆失败。
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有