在using语句中返回后的位图ArgumentException

Rav*_*and 1 c# resize using bitmap argumentexception

所以我目前正在开发一个工作/工作得非常好的图像缩放器,但是当我一次处理太多图像时崩溃程序时它给了我一个OutOfMemoryException.

所以为了解决这个问题,我已经将方法包装在using语句中,这样可以正确处理Bitmaps.

但是我注意到如果我在using语句中返回我的Bitmap,我得到这个"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;
        }
Run Code Online (Sandbox Code Playgroud)

在这里,当我尝试将图像保存在ImageResize方法之外时:

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
    }
Run Code Online (Sandbox Code Playgroud)

当我删除using语句时,一切都工作得很好,但是我必须使用using块来处理Bitmap,以防止内存泄漏.此外,当我将图像保存在using语句中时,它也可以正常工作,但在我的情况下,这不是解决方案.

我究竟做错了什么?对我来说,似乎没有正确返回Bitmap.

我感谢任何帮助,并提前感谢Ravand

Dar*_*con 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);
    }
}
Run Code Online (Sandbox Code Playgroud)