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;
}
}
'foto'は何ですか? – Blorgbeard
'Foto'は特別なイメージエフェクトオブジェクトですが、基本的にはBitmapオブジェクトです。 – lorenzattractor
OK、この行 'pictureBox1.Image = foto.BlurEffect(5);'は 'pictureBox1.Image'の現在の値を考慮に入れていません。 BlurEffectのことは何もしていません。問題は、どのクラスが 'foto'ですか、' BlurEffect() 'メソッドはどのように機能するのでしょうか?それは、基になるビットマップにぼかしを適用し、それを返しますか、またはぼかし効果を適用した*コピー*を返しますか?それは前者のように聞こえる。 – Blorgbeard