Windows phone 7 调整图像亮度
对于windows phone应用程序,当我通过滑块调整亮度时,当我 把它移到右边。但当我回到之前的位置时,图像不再变暗,而是变得越来越亮。这是我基于像素操作的代码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);像素>>
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指定了什么值