对于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值在向前滑动时会连续减小,但是当向后滑动时,它也会逐渐减小。 从过去三个月开始,请帮助我解决这个问题。除此之外,你还就我如何完成整个图像处理给出了建议
答案 0 :(得分:1)
你的算法错了。每次滑块的值发生变化时,您都会将该值添加到图片的亮度中。什么使你的逻辑有缺陷的是滑块返回的值总是正的,你总是将亮度添加到相同的图片。
因此,如果滑块以值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"
}
第二种方式可能会引起一些麻烦。您的算法将RGB值限制为255.在这些情况下,您丢失信息并且无法恢复到旧状态。例如,采用滑块值为255的极端示例。算法将所有像素设置为255,从而生成白色图片。然后将滑块缩小为0,理论上应该恢复原始图像。在这种情况下,你将每个像素减去255,但由于每个像素的值为255,你最终会得到一张黑色图片。
因此,除非您找到解决第二个解决方案中提到的问题的聪明方法,否则我建议您使用第一个解决方案。