2016-05-24 8 views
0

C#では、Windowsフォームのトラックバーの値に基づいて基本的に画像にぼかしフィルタを実装しています。C#でトラックバーの値を正しく使用する方法

private void BarraBlur_Scroll_1(object sender, EventArgs e) 
    { 
     // I take the image inside picture box and use my own Effects class 
     Bitmap image = new Bitmap(pictureBox1.Image); 
     Effects foto = new Effects(image); 

     switch (BarraBlur.Value) 
     { 
      case 0: 

       pictureBox1.Image = imagens; // This reestablishes the image to its original state 
       break; 
      case 1: 
       // Each case reestablishes the image to its original state 
       // and then applies the blur filter with a given depth 
       pictureBox1.Image = imagens; 
       pictureBox1.Image = foto.BlurEffect(1); 
       break; 
      case 2: 
       pictureBox1.Image = imagens; 
       pictureBox1.Image = foto.BlurEffect(2); 
       break; 
      case 3: 
       pictureBox1.Image = imagens; 
       pictureBox1.Image = foto.BlurEffect(3); 
       break; 
      case 4: 
       pictureBox1.Image = imagens; 
       pictureBox1.Image = foto.BlurEffect(4); 
       break; 
      case 5: 
       pictureBox1.Image = imagens; 
       pictureBox1.Image = foto.BlurEffect(5); 
       break; 
      default: 
       break; 
     } 
    } 

私が望むのは、トラックバーの値に応じて、画像にぼかしフィルタを適用することです。 BlurEffectメソッドは引数をとり、フィルタがそのような深さの値で適用されるようにします。

問題は、例えば、ユーザが位置にトラックバーを設定した場合、それは正常に動作し、ということであるが、それは代わりに、元に画像を返す、位置に戻し、それを設定した場合ぼかしフィルタを深度1に適用すると、既にぼかしされた深度2の画像に奥行き1のぼかしが適用されます。

つまり、トラックバーでは、刻み目ごとにフィルタの深さを増やしたい右に行くと、トラックバーの目盛りが残るごとにぼかしの深さが減少します。

私はswitch caseとif文でこれを試しましたが、どちらもうまくいきませんでした。

ありがとうございます。

これは、BlurEffectメソッドを使用したEffectsクラスです。上記

class Effects 
{ 
    private Bitmap imagen; 

    // Constructor 
    public Effects(Bitmap item) 
    { 
     imagen = item; 
    } 
public Bitmap BlurEffect(int depth) 
    { 
     for (int k = 0; k < depth; k++) 
     { 
      for (int i = 2; i < imagen.Width; i++) 
      { 
       for (int j = 2; j < imagen.Height; j++) 
       { 

        try 
        { 

         Color antX1 = imagen.GetPixel(i - 1, j); 
         Color antX2 = imagen.GetPixel(i - 2, j); 

         Color desX1 = imagen.GetPixel(i + 1, j); 
         Color desX2 = imagen.GetPixel(i + 2, j); 

         Color antY1 = imagen.GetPixel(i, j - 1); 
         Color antY2 = imagen.GetPixel(i, j - 2); 

         Color desY1 = imagen.GetPixel(i, j + 1); 
         Color desY2 = imagen.GetPixel(i, j + 2); 


         int promR = (int)((antX1.R + antX2.R + desX1.R + desX2.R + antY1.R + antY2.R + desY1.R + desY2.R + imagen.GetPixel(i, j).R)/9); 
         int promG = (int)((antX1.G + antX2.G + desX1.G + desX2.G + antY1.G + antY2.G + desY1.G + desY2.G + imagen.GetPixel(i, j).G)/9); 
         int promB = (int)((antX1.B + antX2.B + desX1.B + desX2.B + antY1.B + antY2.B + desY1.B + desY2.B + imagen.GetPixel(i, j).B)/9); 


         imagen.SetPixel(i, j, Color.FromArgb(promR, promG, promB)); 


        } 

        catch (Exception) { } 
       } 
      } 
     } 

     return imagen; 
    } 
} 
+0

'foto'は何ですか? – Blorgbeard

+0

'Foto'は特別なイメージエフェクトオブジェクトですが、基本的にはBitmapオブジェクトです。 – lorenzattractor

+1

OK、この行 'pictureBox1.Image = foto.BlurEffect(5);'は 'pictureBox1.Image'の現在の値を考慮に入れていません。 BlurEffectのことは何もしていません。問題は、どのクラスが 'foto'ですか、' BlurEffect() 'メソッドはどのように機能するのでしょうか?それは、基になるビットマップにぼかしを適用し、それを返しますか、またはぼかし効果を適用した*コピー*を返しますか?それは前者のように聞こえる。 – Blorgbeard

答えて

0

まず、繰り返しスイッチで大きなスイッチは必要ありません。

if (BarraBlur.Value = 0) 
{ 
    pictureBox1.Image = imagens; // This reestablishes the image to its original state 
} 
else { 
    pictureBox1.Image = foto.BlurEffect(BarraBlur.Value); 
} 

ただし、これで問題は解決されません。 fotoのクラスはわかりませんが、と同じように、ビットマップのラッパーで、BlurEffect()関数はそのビットマップにぼかし効果を適用してから返します。あなたのコードは、BlurEffectがビットマップのコピーコピーを返すという前提で書かれているようです。

おそらく、新しいfotoあなたがぼかしを変更するたびに構築するために、それを変更することで、あなたのコードを修正することができます:あなたが書いたことが示されたので

if (BarraBlur.Value = 0) 
{ 
    pictureBox1.Image = imagens; // This reestablishes the image to its original state 
} 
else { 
    var blur = new Foto(imagens); // or however the foto is constructed 
    pictureBox1.Image = blur.BlurEffect(BarraBlur.Value); 
} 

を/(Effectsと命名)fotoクラスを制御し、そのクラスの仕組みを(上記の代わりに)変更することもできます。

class Effects 
{ 
    private Bitmap _image; 

    public Effects(Bitmap image) 
    { 
     _image = image; 
    } 

    public Bitmap Blur(int amount) 
    { 
     // .. code to perform blur on _image .. 
     return _image; 
    } 
} 

そして、あなたはおそらくもっとようになり、それを変更する必要があります:現在、それはのようになりますように

が鳴り

class Effects 
{ 
    private Bitmap _image; 

    public Effects(Bitmap image) 
    { 
     _image = image; 
    } 

    public Bitmap Blur(int amount) 
    { 
     var copy = _image.Clone(); 
     // .. code to perform blur on copy .. 
     return copy; 
    } 
} 
+0

はい、私はどのようにクラスを書いたのですか。クラスに関するいくつかのコードを追加しましたが、Visual Studioでは、 "オブジェクト"( 'copy'を参照)には' BitPayel'などの定義が含まれていないと言われています。 – lorenzattractor

+0

それはちょうど鋳造間違いでしたが、あなたの解決策は私の問題を解決しました。どうもありがとうございました!!!! :-) – lorenzattractor

0
pictureBox1.Image = imagens;  
if (BarraBlur.Value == 0) return; 
pictureBox1.Image = foto.BlurEffect(BarraBlur.Value); 

あなたの全体のコードを置き換えます。問題はBlurEffect方法です。そのため、0を使用するたびにイメージを元のイメージに戻すため、そのイメージは機能します。 BlurEffectメソッドの開始時に、イメージを元のイメージにリロードする必要があります。これは、私が再利用するイメージを推測するのではなく、

+0

お返事ありがとうございます。構文はちょっと分かりません。私はC#とVisual Studio 2015を使用していますが、これは無効な構文であることを示しています。 – lorenzattractor

+0

上記のように固定されていても、上に述べたように空のキャッチがあってはならないかどうかはわかりません。ログを追加するか、例外をスローします。 – Claudius

関連する問題