如何使用滑块调整图像的亮度和对比度?

我有一个图像,我想通过xaml中的滑块调整其亮度和对比度。 我不知道从哪里开始。任何帮助将不胜感激。 我正在努力实现这一点

public WriteableBitmap ChangeBrightness(WriteableBitmap inputBitmap, double brightnessValue ) { double Value = brightnessValue; var inputPixels = inputBitmap.Pixels; for (int i = 0; i > 24); var r = (byte)(c >> 16); var g = (byte)(c >> 8); var b = (byte)(c); int ri = r + (int)Value; int gi = g + (int)Value; int bi = b + (int)Value; // Clamp to byte boundaries r = (byte)(ri > 255 ? 255 : (ri  255 ? 255 : (gi  255 ? 255 : (bi < 0 ? 0 : bi)); inputBitmap.Pixels[i] = (a << 24) | (r << 16) | (g << 8) | b; } return inputBitmap; } 

但我认为这没用,我找不到任何有用的文章。

请参阅调整亮度的公式

使用添加公式,您在程序中缺少2个零件。

第1部分:创建一个新的可写位图而不是修改输入位图(返回此新位图)
第2部分:你必须保存位图的原始副本(亮度是不可逆的,如上面的链接所说)


一个非常慢的实现,让你开始。 大多数这些东西都可以在MSDN上找到,如果你只是花一些时间阅读(如果你想让程序比Hello World更先进,你需要进入这个习惯)。

     

 // namespaces using Windows.UI.Xaml.Media.Imaging; using Windows.Storage; // our copy of the image WriteableBitmap copy; public MainPage() { this.InitializeComponent(); } private async void Page_Loaded(object sender, RoutedEventArgs e) { // storage file for the image (load it) StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/bling.png")); // create a bitmap image BitmapImage bi = new BitmapImage(); using ( // Open a stream for the selected file. Windows.Storage.Streams.IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read)) { // load the image into the BitmapImage await bi.SetSourceAsync(fileStream); // create a copy of the image copy = new WriteableBitmap(bi.PixelWidth, bi.PixelHeight); // load the image into writeablebitmap copy fileStream.Seek(0); await copy.SetSourceAsync(fileStream); } } private WriteableBitmap ChangeBrightness(WriteableBitmap source, byte change_value) { WriteableBitmap dest = new WriteableBitmap(source.PixelWidth, source.PixelHeight); byte[] color = new byte[4]; using (Stream s = source.PixelBuffer.AsStream()) { using (Stream d = dest.PixelBuffer.AsStream()) { // read the pixel color while (s.Read(color, 0, 4) > 0) { // color[0] = b // color[1] = g // color[2] = r // color[3] = a // do the adding algo per byte (skip the alpha) for (int i = 0; i < 4; i++) { if ((int)color[i] + change_value > 255) color[i] = 255; else color[i] = (byte)(color[i] + change_value); } // write the new pixel color d.Write(color, 0, 4); } } } // return the new bitmap return dest; } private void mySilder_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) { if (this.mySilder != null) { // deterime the brightness to add byte value_to_add = (byte)((this.mySilder.Value / this.mySilder.Maximum) * 255); // get the new bitmap with the new brightness WriteableBitmap ret = ChangeBrightness(copy, value_to_add); // set it as the source so we can see the change this.myImage.Source = ret; } } 

代码在行动

在此处输入图像描述


如果您正在寻找“bling.png”,可以在这里找到: bling.png

顺便说一句,正确的增加预乘图像亮度的function是

  public static WriteableBitmap ChangeBrightness(WriteableBitmap source, int increment) { var dest = new WriteableBitmap(source.PixelWidth, source.PixelHeight); byte[] color = new byte[4]; using (var srcBuffer = source.PixelBuffer.AsStream()) using (var dstBuffer = dest.PixelBuffer.AsStream()) { while (srcBuffer.Read(color, 0, 4) > 0) { for (int i = 0; i < 3; i++) { var value = (float)color[i]; var alpha = color[3] / (float)255; value /= alpha; value += increment; value *= alpha; if (value > 255) { value = 255; } color[i] = (byte)value; } dstBuffer.Write(color, 0, 4); } } return dest; } 

这是调整Writable Bitmap对比度的代码:

public WriteableBitmap ChangeContrast(WriteableBitmap source,double change_value){var contrastValue = 1 + change_value / 100; WriteableBitmap dest = new WriteableBitmap(source.PixelWidth,source.PixelHeight); byte [] color = new byte [4];

  using (Stream s = source.PixelBuffer.AsStream()) { using (Stream d = dest.PixelBuffer.AsStream()) { while (s.Read(color, 0, 4) > 0) { for (int i = 0; i < 3; i++) { double value = color[i] / (float)255; value -=0.5; value *= contrastValue; value += 0.5; value *= 255; if (value > 255) { value = 255; } if (value < 0) value = 0; color[i] = (byte)value; } d.Write(color, 0, 4); } } } return dest; }