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;私人无效滑块3_ValueChanged(对象发送者,`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;

}

经过调试,我发现rgb值在向前滑动时不断减少,但当向后滑动时,它也在减少,因为它应该增加。请帮助我自过去三个月以来一直在做这件事。除此之外,你还给我一些关于如何完成整个图像处理的建议

4

1 回答 1

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,您最终会得到一张黑色图片。

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

于 2013-05-31T05:57:08.040 回答