2013-05-30 5 views
1

Для приложения Windows phone, когда я регулирую яркость с помощью слайдера, он отлично работает, когда я перемещаю его вправо. Но когда я возвращаюсь к предыдущей позиции, вместо потемнения изображения, она становится ярче и ярче. Вот мой код, основанный на манипуляциях с пикселями.Регулировка яркости изображения

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 

     wrBmp = new WriteableBitmap(Image1, null); 


     for (int i = 0; i < wrBmp.Pixels.Count(); i++) 
     { 
      int pixel = wrBmp.Pixels[i]; 
      int B = (int)(pixel & 0xFF); pixel >>= 8; 
      int G = (int)(pixel & 0xFF); pixel >>= 8; 
      int R = (int)(pixel & 0xFF); pixel >>= 8; 
      int A = (int)(pixel); 

      B += (int)slider1.Value; R += (int)slider1.Value; G += (int)slider1.Value; 
      if (R > 255) R = 255; if (G > 255) G = 255; if (B > 255) B = 255; 
      if (R < 0) R = 0; if (G < 0) G = 0; if (B < 0) B = 0; 
      wrBmp.Pixels[i] = B | (G << 8) | (R << 16) | (A << 24); 
     } 
     wrBmp.Invalidate(); 
     Image1.Source = wrBmp; 

    } 

Что мне не хватает и есть какие-либо проблемы со значением ползунка. Я работаю с маленькими изображениями, как обычно, на мобильных телефонах. Я уже пытался копировать оригинальное изображение, чтобы его дублировать. Я думаю, что код прекрасен, после многих исследований я обнаружил, что проблема связана с значением ползунка. Возможное решение назначает начальное значение слайдеру. Мне нужна помощь с кодом.

частный двойной lastSlider3Vlaue; частная пустота slider3_ValueChanged (объект отправителя, `RoutedPropertyChangedEventArgs е) {

 if (slider3 == null) return; 
     double[] contrastArray = { 1, 1.2, 1.3, 1.6, 1.7, 1.9, 2.1, 2.4, 2.6, 2.9 }; 
     double CFactor = 0; 
     int nIndex = 0; 
     nIndex = (int)slider3.Value - (int)lastSlider3Vlaue; 
     if (nIndex < 0) 
     { 
      nIndex = (int)lastSlider3Vlaue - (int)slider3.Value; 
      this.lastSlider3Vlaue = slider3.Value; 
      CFactor = contrastArray[nIndex]; 
     } 
     else 
     { 
      nIndex = (int)slider3.Value - (int)lastSlider3Vlaue; 
      this.lastSlider3Vlaue = slider3.Value; 
      CFactor = contrastArray[nIndex]; 
     } 

     WriteableBitmap wbOriginal; 
     wbOriginal = new WriteableBitmap(Image1, null); 
     wrBmp = new WriteableBitmap(wbOriginal.PixelWidth, wbOriginal.PixelHeight); 
     wbOriginal.Pixels.CopyTo(wrBmp.Pixels, 0); 
     int h = wrBmp.PixelHeight; 
     int w = wrBmp.PixelWidth; 
     for (int i = 0; i < wrBmp.Pixels.Count(); i++) 
     { 
      int pixel = wrBmp.Pixels[i]; 
      int B = (int)(pixel & 0xFF); pixel >>= 8; 
      int G = (int)(pixel & 0xFF); pixel >>= 8; 
      int R = (int)(pixel & 0xFF); pixel >>= 8; 
      int A = (int)(pixel); 

      R = (int)(((R - 128) * CFactor) + 128); 
      G = (int)(((G - 128) * CFactor) + 128); 
      B = (int)(((B - 128) * CFactor) + 128); 

      if (R > 255) R = 255; if (G > 255) G = 255; if (B > 255) B = 255; 
      if (R < 0) R = 0; if (G < 0) G = 0; if (B < 0) B = 0; 
      wrBmp.Pixels[i] = B | (G << 8) | (R << 16) | (A << 24); 
     } 

     wrBmp.Invalidate(); 
     Image1.Source = wrBmp; 

}

После отладки я обнаружил, что значения RGB уменьшаются непрерывно при скольжении вперед, но при скольжении назад она также уменьшается, где по мере того как он увеличивается. , пожалуйста, помогите iam, работая над этим с прошлых последних трех месяцев. Кроме того, вы также дадите мне совет о том, как я могу завершить всю обработку изображения.

+0

кто-нибудь helppp .... –

+0

Если вы всегда добавляете значение к значениям rgb, они всегда будут ярче. Я не думаю, что у вас есть отрицательные значения слайдера? –

+0

эй, спасибо за рассмотрение этого вопроса, в xaml я установил максимальный и минимальный для слайдера 100 и -100 соответственно. Так что в слайдере сначала находится середина, поэтому он имеет отрицательное значение, которое он скользит назад, но, как и сказал, двигаясь вперед , то перемещение назад не имеет никакого положительного значения. Итак, я уже знаю эту проблему. Мне нужна помощь со стороны ура, так как я могу решить эту проблему с помощью значений ползунка –

ответ

1

Ваш алгоритм неверен. Каждый раз, когда значение ползунка изменяется, вы добавляете это значение к яркости изображения. Недостаток вашей логики в том, что значение, возвращаемое слайдером, всегда будет положительным, и вы всегда добавляете яркость к тому же изображению.

Итак, если ползунок начинается со значения 10, я добавлю 10 к яркости изображения.

Затем я сдвигаюсь до 5. Я добавлю 5 к изображения предыдущего изображения (тот, который вы уже добавили 10 яркости).

Два пути решения проблемы:

  1. сохранить копию исходного изображения, и дублировать его каждый раз, когда ваш метод называется. Затем добавьте яркость к копии (а не к оригиналу). Это самый безопасный способ.

  2. Вместо добавления нового абсолютного значения ползунка, вычислить относительную величину (насколько она изменилась с момента последнего вызова метода:

    private double lastSliderValue; 
    
    private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
        var offset = slider1.Value - this.lastSliderValue; 
        this.lastSliderValue = slider1.Value; 
    
        // Insert your old algorithm here, but replace occurences of "slider1.Value" by "offset" 
    } 
    

Этот второй путь может привести к Тем не менее, у вас немного головных болей. Ваш алгоритм ограничивает значения RGB до 255. В этих случаях вы теряете информацию и не можете вернуться в прежнее состояние. Например, возьмите крайний пример значения ползунка 255. Алгоритм устанавливает все пикселов до 255, создавая тем самым белое изображение. Затем вы уменьшаете слайдер до 0, что теоретически восстанавливает исходное изображение. в этом случае вы вычитаете 255 для каждого пикселя, но поскольку значение каждого пикселя равно 255, вы получите черное изображение.

Поэтому, если вы найдете умный способ решить проблему, упомянутую во втором решении, я бы рекомендовал перейти к первому.

+0

Hey kookiz, я очень ценю, что я рассмотрел мой вопрос, но он не работает из-за его логики смещения. Если мы не назначаем какое-либо значение (позиция) для lastSliderValue, тогда смещение будет равно slider1.value, тогда почему объявить смещение, мы можем дать непосредственно slider1.value. Но вы сказали, что нам нужно дать относительное значение, которое правильно. Теперь, что мы назначили lastSliderValue.Help ............... ..... –

+0

@bhupsiiiiiii ... Я не уверен, в чем ваш смысл, но в любом случае смещение логики ошибочно, как я заявил в своем заключении. Идите с первым решением. –

+0

Эй, кукиз, я работал над первым решением. Но здесь нам нужен слайдер, поэтому для события изменения значения слайдера какое значение sholud мы присваиваем slider1.value. После исследования я обнаружил, что после перемещения некоторого + ve расстояния добавляет некоторое положительное значение, опять же после перемещения назад немного, это также добавление в соответствии с slider1.value.So для этого можно найти решение, я также пытаюсь .... –

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