2014-11-21 53 views
1

因此,我目前正在研究一个图像调整器工作/工作相当好,但除了它给我一个OutOfMemoryException当我一次处理太多的图像崩溃程序。Bitmap ArgumentException返回使用语句后

因此,为了解决这个问题,我已经将方法封装在using语句中,以便Bitmaps可以正确处理。

但是我注意到,如果我回到using语句在我的位图我得到这个“ArgumentException的是未处理”的消息

这里我ImageResize方法:

public Bitmap ResizeImage(MemoryStream ms, Size size) 
    { 
     if (comboBox2.Text == "Pixel") 
     { 
      using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height)) 
      { 
       var original = new Bitmap(ms, true); 
       Graphics graphic = Graphics.FromImage(img); 

       //IRRELEVANT CODE..... 

       return img; 
      } 
     } 
     else 
     { 
      return null; 
     } 

在这里,当我尝试保存

private void button1_Click(object sender, EventArgs e) 
    { 
    //IRRELEVANT CODE ... 
    img = ResizeImage(memory, new Size(getX(), getY())); 
    //IRRELEVANT CODE ... 
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here 
    } 

当我删除using语句再次一切工作完全正常,但我必须使用日:我的ImageResize方法外树形象e使用块来处理Bitmap并为此防止内存泄漏。 另外,当我将图像保存在using语句中时,它也可以正常工作,但对我来说这不是一个解决方案。

我在做什么错?对我来说,似乎位图不能正确返回。

我感谢所有帮助和感谢提前 Ravand

+0

我喜欢评论'/ IRRELEVANT CODE ...'。它属于[此线程](http://stackoverflow.com/q/184618/2596334)。 – 2014-11-21 13:12:24

+0

哈哈哈贴吧,如果你喜欢:D,但老实说在这种情况下它是无关紧要的 – Ravand 2014-11-21 13:14:42

回答

0

好吧,我终于固定的内存泄漏问题,原来,我确实发布/配置的图像,但它没有这样做不够快当你正在处理很多非常大的图像时,这会导致OutOfMemoryException异常。我试着让所有的东西都是多线程的,并且一直等待WorkingSet变得更小而没有成功。

原来它比我更容易thhought,我不得不做的就是把这个在我调整大小的方法的末尾:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
System.Threading.Thread.SpinWait(5000); 

,这似乎做魔术与10调整大图尺寸为20mb,分辨率为10000x10000。有人可以解释为什么SpinWait有帮助,但不是正常的线程睡眠?每当我尝试睡觉线程时,它似乎也睡觉了内存的释放。

5

你你在错误的地方使用放。在使用块(包括从其返回)结束之后,处理由块控制的对象。访问已处理的位图是一个错误。

你的使用需求,而不是在这里:

private void button1_Click(object sender, EventArgs e) 
{ 
    //IRRELEVANT CODE ... 
    using(img = ResizeImage(memory, new Size(getX(), getY()))) 
    { 
     //IRRELEVANT CODE ... 
     img.Save(outputFileName, codec, encoderParams); 
    } 
} 
+0

提供有关不太相关代码的更多细节,或者只是限制你一次处理多少图片。 – 2014-11-21 13:22:54

+0

哦,我是sry,我错过了,我没有得到MemoryException,但我得到了我现在在ResizeImage方法中的按钮点击事件中收到的ArgumentException ...如此友善我回到我开始的地方 – Ravand 2014-11-21 13:38:50

+0

1.你在'ResizeImage'中删除了'using'? 2.有什么论点? – 2014-11-21 13:50:35