У меня есть этот простой код на C#, который в основном реализует фильтр размытия для изображения на основе значения Trackbar в Windows Forms.Как правильно использовать значения Trackbar в 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;
}
}
То, что я хочу, что, в зависимости от значения TrackBar всякий раз, когда он установлен, чтобы применить фильтр размытия к изображению. Метод BlurEffect принимает аргумент int, так что фильтр применяется в таком значении глубины.
Проблема заключается в том, что, если, например, пользователь устанавливает TrackBar в второй позиции, он отлично работает, но когда он устанавливает его обратно в положение первый, вместо того, чтобы вернуться изображение к оригиналу и затем применяя фильтр размытия с глубиной 1, он применяет размытие глубины 1 к уже размытому изображению с глубиной 2.
Другими словами, я хочу, чтобы гусеница увеличивала глубину фильтра каждый раз, когда галочка идет вправо и уменьшает глубину размытия каждый раз, когда галочка трекбола уходит влево.
Я пробовал это с помощью коробок и если бы заявления, но они не работали.
Большое спасибо.
Это класс Effects
с методом BlurEffect.
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);' is not (ОК, очень маловероятно) с учетом текущего значения 'pictureBox1.Image' - поэтому сбросить его до' imagens' до выполнение BlurEffect ничего не делает. Вопрос в том, какой класс 'foto', и как работает метод BlurEffect()? Применяет ли это размытие к базовому растровому изображению, а затем возвращает его или возвращает * копию * с примененным эффектом размытия? Похоже, это может быть первый. – Blorgbeard