2010-12-14 20 views
0

私はチャンネルフィルタリングのためにAForge.netを使用しています.3つのボタン、赤、青、緑を持っています。 ボタンをクリックすると、赤いチャンネルのフィルターが適用されます。しかし、青いボタンをクリックすると赤と重なり、画像が暗くなります。画像のフィルタを削除します

ブルーがクリックされたときに赤のチャンネルを「処分」する方法は誰も知っていますか?以下は私のコードのスニペットです。

private void redchannel_Click_1(object sender, EventArgs e) 
    { 
     try 
     { 

      pictureBox1.Image = pic; 
      pictureBox2.Image = pic2; 

      // create filter 
      ChannelFiltering filter = new ChannelFiltering(); 
      // set channels' ranges to keep 
      filter.Red = new IntRange(0, 255); 
      filter.Green = new IntRange(255, 255); 
      filter.Blue = new IntRange(255, 255); 
      // apply the filter 
      filter.ApplyInPlace(pic2); 


     } 


     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 
     } 
    } 

    private void bluechannel_Click_1(object sender, EventArgs e) 
    { 
     try 
     { 
      pictureBox1.Image = pic; 
      pictureBox2.Image = pic2; 

      // create filter 
      ChannelFiltering filter = new ChannelFiltering(); 
      // set channels' ranges to keep 
      filter.Red = new IntRange(255, 255); 
      filter.Green = new IntRange(255, 255); 
      filter.Blue = new IntRange(0, 255); 
      // apply the filter 
      filter.ApplyInPlace(pic2); 

     } 




     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 
     } 
    } 

    private void greenchannel_Click_1(object sender, EventArgs e) 
    { 
     try 
     { 
      pictureBox1.Image = pic; 
      pictureBox2.Image = pic2; 

      // create filter 
      ChannelFiltering filter = new ChannelFiltering(); 
      // set channels' ranges to keep 

      filter.Red = new IntRange(255, 255); 
      filter.Green = new IntRange(0, 255); 
      filter.Blue = new IntRange(255, 255); 
      // apply the filter 
      filter.ApplyInPlace(pic2); 
     } 
     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 

     } 
    } 
+1

コード分解は良いことです! –

+0

haha​​はい合意しました! – LouisL

答えて

2

オリジナルイメージと変更された表示イメージを保存する必要があります。オリジナルの計算を行い、表示イメージで表示します。オリジナルを変更せず、表示イメージのみを変更します。

+0

はい、私は私のプログラムでそれをやっています。私は2つのpictureBoxを持っています。 pictureBox1は元の画像で、私はそこからピクセルを取得し、pictureBox2の画像にピクセルを設定します。 – LouisL

+0

その後、何かを "削除"する必要はありませんし、問題が何であるか分かりません。 –

1

あなたが現在行っていることは、元の写真のコピーとしてpic2を初期化することです。次に、pic2にフィルタを追加し続けます。だから何が起こるかは、あなたがきれいな画像を持っていることです、そして、1番目のフィルター、2番目のフィルターなどを適用します。

私が変更になります。

pictureBox1.Image = pic; 
pictureBox2.Image = pic.clone(); 

ため

pictureBox1.Image = pic; 
pictureBox2.Image = pic2; 

をもう一つは、あなたが同じ関数にすべての3つのボタンをポイントする場合がありますです。現在の3つの機能の90%がコードの繰り返しです。メンテナンスのための悪夢。

もっと良い解決策は次のようになります:もう一つの方法は、赤色、緑色の新しいフィルター機能をパラメーターとして呼び出す、各ボタンを別々に保つことです(& Blue)。

関連する問題