Windows phone 7 调整图像亮度

Windows phone 7 调整图像亮度,windows-phone-7,c#-4.0,Windows Phone 7,C# 4.0,对于windows phone应用程序,当我通过滑块调整亮度时,当我 把它移到右边。但当我回到之前的位置时,图像不再变暗,而是变得越来越亮。这是我基于像素操作的代码 private void slider1\u值已更改(对象发送方,RoutedPropertyChangedEventArgs e) { wrBmp=新的可写位图(Image1,null); 对于(int i=0;i>=8; int G=(int)(像素&0xFF);像素>>=8; int R=(int)(像素&0xFF);像素>>

对于windows phone应用程序,当我通过滑块调整亮度时,当我 把它移到右边。但当我回到之前的位置时,图像不再变暗,而是变得越来越亮。这是我基于像素操作的代码

private void slider1\u值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
{
wrBmp=新的可写位图(Image1,null);
对于(int i=0;i>=8;
int G=(int)(像素&0xFF);像素>>=8;
int R=(int)(像素&0xFF);像素>>=8;
int A=(int)(像素);
B+=(int)slider1.Value;R+=(int)slider1.Value;G+=(int)slider1.Value;
如果(R>255)R=255;如果(G>255)G=255;如果(B>255)B=255;
如果(R<0)R=0;如果(G<0)G=0;如果(B<0)B=0;
wrBmp.Pixels[i]=B |(G>=8;
int R=(int)(像素&0xFF);像素>>=8;
int A=(int)(像素);
R=(int)(((R-128)*CFactor)+128);
G=(int)((G-128)*CFactor)+128);
B=(int)((B-128)*CFactor)+128);
如果(R>255)R=255;如果(G>255)G=255;如果(B>255)B=255;
如果(R<0)R=0;如果(G<0)G=0;如果(B<0)B=0;

wrBmp.Pixels[i]=B |(G您的算法是错误的。每次滑块的值更改时,您都会将该值添加到图片的亮度中。使您的逻辑有缺陷的是,滑块返回的值始终为正值,并且您总是将亮度添加到相同的图片中

因此,如果滑块以值10开始,我将为图片的亮度增加10

然后,我滑到5。我将在前一张图片的
亮度上加5(你已经加了10的亮度)

解决这一问题的两种方法:

  • 保留原始图片的副本,并在每次调用方法时复制它。然后将亮度添加到副本(而不是原始图片)。这是最安全的方法

  • 计算相对值,而不是添加滑块的新绝对值(自上次调用该方法以来,相对值发生了多大变化):

    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"
    }
    
    私有双lastSliderValue;
    私有无效滑块1_值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
    {
    var offset=slider1.Value—this.lastSliderValue;
    this.lastSliderValue=slider1.Value;
    //在此处插入旧算法,但将出现的“slider1.Value”替换为“offset”
    }
    
  • 不过,第二种方法可能会带来一些麻烦。您的算法将RGB值限制为255。在这种情况下,您将丢失信息,无法恢复到旧状态。例如,以滑块值255为例。该算法将所有像素设置为255,从而生成白色图片。然后减少sli将der设置为0,理论上应恢复原始图片。在这种情况下,每个像素减去255,但由于每个像素的值都是255,因此最终将得到黑色图片


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

    你的算法是错误的。每次滑块的值改变时,你都会将该值添加到图片的亮度中。使你的逻辑有缺陷的是,滑块返回的值总是p如果是正片,您总是将亮度添加到相同的
    图片中

    因此,如果滑块以值10开始,我将为图片的亮度增加10

    然后,我滑到5。我将在前一张图片的亮度上加5(你已经加了10的亮度)

    解决这一问题的两种方法:

  • 保留原始图片的副本,并在每次调用方法时复制它。然后将亮度添加到副本(而不是原始图片)。这是最安全的方法

  • 计算相对值,而不是添加滑块的新绝对值(自上次调用该方法以来,相对值发生了多大变化):

    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"
    }
    
    私有双lastSliderValue;
    私有无效滑块1_值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
    {
    var offset=slider1.Value—this.lastSliderValue;
    this.lastSliderValue=slider1.Value;
    //在此处插入旧算法,但将出现的“slider1.Value”替换为“offset”
    }
    
  • 不过,第二种方法可能会带来一些麻烦。您的算法将RGB值限制为255。在这种情况下,您将丢失信息,无法恢复到旧状态。例如,以滑块值255为例。该算法将所有像素设置为255,从而生成白色图片。然后减少sli将der设置为0,理论上应恢复原始图片。在这种情况下,每个像素减去255,但由于每个像素的值都是255,因此最终将得到黑色图片


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

    嘿,库奇兹,我真的很感激,你考虑了我的qoestion,但由于其偏移量的逻辑,它不起作用。如果我们不指定任何值(平均位置)对于lastSliderValue,那么offset将等于slider1.value,那么为什么要声明offset,我们可以直接给出slider1.value。但是你已经说过我们必须给出相对值,这是正确的。现在我们已经分配了lastSliderValue。帮助………@bhupsiiii…我不确定你的观点是什么,但不管怎样,offset逻辑是有缺陷的我在结论中说了。改为使用第一个解决方案。嘿,kookiz,我已经研究了你的第一个解决方案。但这里我们还需要一个滑块,所以对于滑块值更改事件,我们为滑块1指定了什么值