为什么图像为空?

时间:2014-01-05 22:53:12

标签: c# winforms

在form1构造函数

bitmapwithclouds = new Bitmap(@"D:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Resources\test.png");
cleanradar = new Bitmap(Properties.Resources.clean_radar_image);
CloudEnteringAlert.CloudsOnly(bitmapwithclouds, Properties.Resources.clean_radar_image);
pictureBox3.Image = CloudEnteringAlert.newbitmap;

在CloudEnteringAlert类中,我有方法CloudsOnly:

public static Bitmap CloudsOnly(Bitmap bitmapwithclouds, Bitmap bitmapwithoutclouds)
        {
            tolerancenumeric = 15;
            Color backgroundColor = Color.Black; 
            int tolerance = tolerancenumeric * tolerancenumeric + tolerancenumeric * tolerancenumeric + tolerancenumeric * tolerancenumeric; 
            Bitmap newbitmap = new Bitmap(512, 512); 
            for (int x = 0; x < bitmapwithclouds.Width; x++)
            {
                for (int y = 0; y < bitmapwithclouds.Height; y++)
                {
                    Color color1 = bitmapwithclouds.GetPixel(x, y);
                    Color color2 = bitmapwithoutclouds.GetPixel(x, y);
                    Color color = Color.Black;

                    int dR = (int)color2.R - (int)color1.R;
                    int dG = (int)color2.G - (int)color1.G;
                    int dB = (int)color2.B - (int)color1.B;
                    int error = dR * dR + dG * dG + dB * dB;


                    if ((x == 479) && (y == 474))
                    {
                        color = Color.Black;
                    }

                    if (error < tolerance)
                    {

                        color = backgroundColor;

                    }
                    else
                    {

                        color = color1; 

                    }
                    newbitmap.SetPixel(x, y, color);
                }
            }
            newbitmap.Save(@"d:\test\newbitmap.jpg");
            return newbitmap;
        }

In the middle of the method im using getpixel and setpixel.

我使用了一个断点,我看到它返回newbitmap后所以newbitmap是非null。

但在for1上就行了:

pictureBox3.Image = CloudEnteringAlert.newbitmap;

图片为空。

在方法CloudEnteringAlert中,我在类的顶部添加了newbitmap作为static。 在CloudsOnly方法中,我为位图创建了实例。 我将文件保存在硬盘上后也会看到该文件。

public static Bitmap newbitmap;

那么为什么当我将它分配给picturebox3时它为null?

2 个答案:

答案 0 :(得分:1)

下面代码中的newbitmap是一个局部变量,它永远不会从这个方法外部访问,更不用说从另一个类了。

您最后会返回它,但调用代码会像过程一样调用此函数,结果会丢失。

我猜你也有一个public CloudEnteringAlert.newbitmap属性或字段,但它被同名的局部变量掩盖了。

public static Bitmap CloudsOnly(Bitmap bitmapwithclouds, Bitmap bitmapwithoutclouds)
{
    ...
    Bitmap newbitmap = new Bitmap(512, 512);   // local variable
    ...
    return newbitmap;
}

最短(不是最优雅)的补丁是:

public static void CloudsOnly(Bitmap bitmapwithclouds, Bitmap bitmapwithoutclouds)
{
    ...
    //Bitmap newbitmap = new Bitmap(512, 512);   // local variable
    newbitmap = new Bitmap(512, 512);            // class member 
    ...
    // return newbitmap;
}

答案 1 :(得分:0)

您实际上并未分配pictureBox3.Image。您在方法中创建一个新的并返回它,但是您没有对它做任何事情。更改您的代码,以便newbitmap将返回到您的图片框。

pictureBox3.Image =  CloudEnteringAlert.CloudsOnly(bitmapwithclouds,Properties.Resources.clean_radar_image);