调整图像亮度

时间:2013-05-30 19:47:31

标签: windows-phone-7 c#-4.0

对于Windows手机应用程序,当我通过滑块调整亮度时,我可以正常工作 把它移到右边。但是,当我回到以前的位置,而不是图像变暗,它变得更亮更明亮。这是我基于像素操作的代码。

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;

    }

我缺少什么,滑块值有什么问题。我正常在手机中处理小图像。我已经尝试将原始图像复制到复制图像。我认为代码是完美的,经过大量研究后我发现问题是由于滑块值。可能的解决方案是为滑块分配初始值。我想要一些代码帮助。

private double lastSlider3Vlaue;  private void slider3_ValueChanged(object sender,`RoutedPropertyChangedEventArgs e)         {

        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;

}

经过调试后,我发现r g b值在向前滑动时会连续减小,但是当向后滑动时,它也会逐渐减小。 从过去三个月开始,请帮助我解决这个问题。除此之外,你还就我如何完成整个图像处理给出了建议

1 个答案:

答案 0 :(得分: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"
    }
    
  3. 第二种方式可能会引起一些麻烦。您的算法将RGB值限制为255.在这些情况下,您丢失信息并且无法恢复到旧状态。例如,采用滑块值为255的极端示例。算法将所有像素设置为255,从而生成白色图片。然后将滑块缩小为0,理论上应该恢复原始图像。在这种情况下,你将每个像素减去255,但由于每个像素的值为255,你最终会得到一张黑色图片。

    因此,除非您找到解决第二个解决方案中提到的问题的聪明方法,否则我建议您使用第一个解决方案。