2016-05-24 5 views
0

У меня есть этот простой код на 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; 
    } 
} 
+0

Что такое 'foto'? – Blorgbeard

+0

'Foto' - это просто специальный объект эффектов изображения, но он по существу является объектом Bitmap. – lorenzattractor

+1

OK, ну эта строка 'pictureBox1.Image = foto.BlurEffect (5);' is not (ОК, очень маловероятно) с учетом текущего значения 'pictureBox1.Image' - поэтому сбросить его до' imagens' до выполнение 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); 
} 

Поскольку вы указали, что вы написали/контролировать foto класс (названный Effects), вы также можете изменить способ работы этого класса (вместо этого).

Похоже, в настоящее время она выглядит примерно так:

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') не содержит определения для' GetPixel' и т. Д., Которые являются методами «Bitmap». – 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

Смежные вопросы