在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?
答案 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);