2014-01-05 12 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; 

Изображение является недействительным.

В методе CloudEnteringAlert я добавил newbitmap как статический в верхней части класса. В методе CloudsOnly я создаю экземпляр для растрового изображения. Я также вижу файл после его сохранения на жестком диске.

public static Bitmap newbitmap; 

Так почему же его null, когда я назначаю его в 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); 
Смежные вопросы