C# 为什么图像是空的?
在form1构造函数中C# 为什么图像是空的?,c#,winforms,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(bitmapwith
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.
图像为空
在CloudEnteringAlert方法中,我在类的顶部添加了newbitmap作为static。
在方法CloudsOnly中,我为位图创建实例。
我还看到了保存在硬盘上的文件
public static Bitmap newbitmap;
那么,当我将它分配给picturebox3时,为什么它为空呢?下面代码中的
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;
}
您从未实际分配过
pictureBox3.Image
。您可以在方法中创建一个新的方法并返回它,但不使用它做任何事情。更改您的代码,以便将newbitmap
返回到您的picturebox中
pictureBox3.Image = CloudEnteringAlert.CloudsOnly(bitmapwithclouds,Properties.Resources.clean_radar_image);
显示整个相关代码,而不是描述它。另外,您发布的代码没有编译。请检查函数的最后一行。@JoelCoehoorn-是的,但这与调用代码不匹配。我已经在编辑了。
pictureBox3.Image = CloudEnteringAlert.CloudsOnly(bitmapwithclouds,Properties.Resources.clean_radar_image);