方法错误地返回Image对象c#.Net

时间:2011-09-20 12:10:53

标签: .net image methods

我有一个问题,我有一个方法,它采取一个Image对象,将其处理为1个颜色通道(另外2个是纯黑色),然后从该过程返回一个新图像。

现在的问题是,当我在方法中创建新图像并在调试期间查看对象时,图像对象看起来非常好。但是当我将它返回到一个空的Image对象时,该Image对象内的属性都显示“System.ArgumentException”

这是该方法的代码:

    public Image GetRedImage(Image sourceImage)
    {
        using (Bitmap bmp = new Bitmap(sourceImage))
        using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))
        {
            for (int x = 0; x < bmp.Width; x++)
            {
                for (int y = 0; y < bmp.Height; y++)
                {
                    Color pxl = bmp.GetPixel(x, y);
                    Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);

                    redBmp.SetPixel(x, y, redPxl);
                }
            }
            Image tout = (Image)redBmp;

            return tout;
        }

    }
谁知道到底发生了什么?

非常感谢。

3 个答案:

答案 0 :(得分:3)

redBmp正在被你的使用块处理掉,并且tout是redBmp强制转换为Image类型。删除redBmp的使用块。

门诺

答案 1 :(得分:1)

您已将redBmp包装在using语句中,以便在方法退出时调用Dispose方法。如果您要在方法之外使用它(您将其转换为Image并将其返回),则不应将其丢弃。

public Image GetRedImage(Image sourceImage)
{
    Bitmap redBmp = null;
    using (Bitmap bmp = new Bitmap(sourceImage))
    {
        redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);
        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                Color pxl = bmp.GetPixel(x, y);
                Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);

                redBmp.SetPixel(x, y, redPxl);
            }
        }
    }

    return redBmp as Image;
}

答案 2 :(得分:1)

使用using块,一旦离开使用范围,就会处理图像。

尝试从顶部替换这两行:

using (Bitmap bmp = new Bitmap(sourceImage))
using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))

使用:

Bitmap bmp = new Bitmap(sourceImage);
Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);

现在它应该可以工作,根据您的程序逻辑,您将不得不手动处理这些图像。

你可能也会使用bmp处理使用但肯定不是redBmp对象,因为你基本上都要返回它,所以要么你克隆它并返回克隆,要么你不处理它,或者你返回一个处理不可用的对象,就像现在正在发生的事情一样。