2014-01-05 73 views
1

在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不爲空。

但在上線FOR1:

pictureBox3.Image = CloudEnteringAlert.newbitmap; 

的圖像爲null。

在CloudEnteringAlert方法中,我在類的頂部將newbitmap添加爲靜態。 在方法CloudsOnly我爲位圖製作實例。 我將文件保存到硬盤後也會看到該文件。

public static Bitmap newbitmap; 

那麼,爲什麼它爲空時,我將它分配給picturebox3?

+3

顯示整個相關代碼而不是描述它。此外,您發佈的代碼不會編譯。 – BartoszKP

回答

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; 
} 
+0

檢查函數的最後一行。 –

+0

@JoelCoehoorn - 是的,但與調用代碼不匹配。我已經在編輯了。 –

0

你是不是曾經實際分配pictureBox3.Image。你在你的方法中創建一個新的並返回它,但你沒有做任何事情。更改您的代碼,以便newbitmap將返回到您的圖片框。

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