关于对比度:
调节对比度直观感受是,高对比度的图像明暗关系更明显,色彩更鲜艳;低对比度的图像表面像是蒙上一层灰,色彩不鲜艳。

需求:
制作一个面板,一个滑动条,拖动滑动条可以修改目标图片的对比度。

资料参考:


界面滑动条两端的值是-30~30,默认处于中间位置0。已知目标图像的Bitmap数据。

  1. 修改Bitmap的对比度。
  2. 将修改之后的Bitmap重新赋值给界面Image控件显示。
        /// <summary>
/// 调节对比度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Contrast_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
// 滑动条是值是-30~30
// originalBitmap是目标图像的Bitmap
int threshold = (int)e.NewValue;
Bitmap newBitmap = BitmapHelper.Contrast(originalBitmap, threshold); // 重新给Image控件赋值新图像
image.Source = SystemUtils.ConvertBitmapToBitmapImage(newBitmap);
}

下面调节图像对比度的工具方法:

    /// <summary>
/// 代码来自:https://softwarebydefault.com/2013/04/20/image-contrast/
/// </summary>
public static class BitmapHelper
{
/// <summary>
/// 调节图像的对比度
/// </summary>
/// <param name="sourceBitmap"></param>
/// <param name="threshold">阈值,通过该参数控制调节</param>
/// <returns></returns>
public static Bitmap Contrast(this Bitmap sourceBitmap, int threshold)
{
BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(, ,
sourceBitmap.Width, sourceBitmap.Height),
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] pixelBuffer = new byte[sourceData.Stride * sourceData.Height]; Marshal.Copy(sourceData.Scan0, pixelBuffer, , pixelBuffer.Length); sourceBitmap.UnlockBits(sourceData); double contrastLevel = Math.Pow((100.0 + threshold) / 100.0, ); double blue = ;
double green = ;
double red = ; for (int k = ; k + < pixelBuffer.Length; k += )
{
blue = ((((pixelBuffer[k] / 255.0) - 0.5) *
contrastLevel) + 0.5) * 255.0; green = ((((pixelBuffer[k + ] / 255.0) - 0.5) *
contrastLevel) + 0.5) * 255.0; red = ((((pixelBuffer[k + ] / 255.0) - 0.5) *
contrastLevel) + 0.5) * 255.0; if (blue > )
{ blue = ; }
else if (blue < )
{ blue = ; } if (green > )
{ green = ; }
else if (green < )
{ green = ; } if (red > )
{ red = ; }
else if (red < )
{ red = ; } pixelBuffer[k] = (byte)blue;
pixelBuffer[k + ] = (byte)green;
pixelBuffer[k + ] = (byte)red;
} Bitmap resultBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height); BitmapData resultData = resultBitmap.LockBits(new Rectangle(, ,
resultBitmap.Width, resultBitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(pixelBuffer, , resultData.Scan0, pixelBuffer.Length);
resultBitmap.UnlockBits(resultData); return resultBitmap;
}
}

下面是将Bitmap转换为BitmapImage的工具方法,以供WPF的Image控件使用图像:

    public static class SystemUtils
{
/// <summary>
/// 转换类型:Bitmap --> BitmapImage
/// <summary>
/// <returns></returns>
public static BitmapImage ConvertBitmapToBitmapImage(Bitmap bitmap)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png); stream.Position = ;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
// According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
// Force the bitmap to load right now so we can dispose the stream.
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = stream;
bi.EndInit();
bi.Freeze(); return bi;
}
}
}

测试效果如下:


另外,关于图像的HSL(色相、饱和度、明度)的调节,可参考在下的另一篇博文:


参考资料:

https://softwarebydefault.com/2013/04/20/image-contrast/

【C#/WPF】调节图像的对比度(Contrast)的更多相关文章

  1. 【C#/WPF】调节图像的HSL(色相Hue、饱和度Saturation、明亮度Lightness)

    先说概念: HSL是一种描述颜色的方式,其他颜色描述方式还有大家熟悉的RGB值.HSL三个字母分别表示图像的Hue色相.Saturation饱和度.Lightness明亮度. 需求: 制作一个面板,包 ...

  2. 【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)

    原文:[C#/WPF]调节图像的HSL(色相.饱和度.明亮度) 先说概念: HSL是一种描述颜色的方式(其他颜色描述方式还有大家熟悉的RGB值).HSL三个字母分别表示图像的Hue色相.Saturat ...

  3. OpenCV学习:改变图像的对比度和亮度

    本实例演示简单地改变图像的对比度和亮度,使用了如下线性变换来实现像素值的遍历操作: The parameters α > 0 and β often called the gain and bi ...

  4. Python: PS 图像调整--对比度调整

    本文用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = RGB + (RGB - Threshold) * Contrast / 255 公式中,nRG ...

  5. OpenCV --- 修改图像的对比度、亮度 、RGB转Gray图像、修改图像的尺寸

    #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgu ...

  6. 借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制

    原文:借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制 本文所示例子是借助第三方设计软件,制作复杂的矢量图形,转成与XAML酷似的SVG,再转换成xaml而实现的. 这 ...

  7. theano 实现图像局部对比度归一化

    很多时候我们需要对图像进行局部对比度归一化,比如分块CNN的预处理阶段.theano对此提供了一些比较方便的操作. 局部归一化的一种简单形式为: 其中μ和σ分别为局部(例如3x3的小块)的均值和标准差 ...

  8. WPF图形图像相关类

    BitmapMetadata类: 继承自抽象类ImageMetadata,包含图像的原数据信息,如相机型号.图像修改程序名称.拍照日期.拍照地点等.ImageSoure类包含ImageMetadata ...

  9. OpenCV 改变图像的对比度和亮度

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ios ...

随机推荐

  1. 如何在 Linux 下调试动态链接库

    大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数.我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题. 首先,假设我们准备这样的一个动 ...

  2. 配置Kafka集群和zookeeper集群

    原文链接请参见:http://www.cnblogs.com/5iTech/articles/6043224.html

  3. go 学习笔记(2) --变量、常量、iota、数组

    参考网址:https://gobyexample.com 变量 Go中使用全新的关键字var来声明变量.var我们并不陌生,在Javascript 和C#中均有出现.不同的是Go和C#中变量属于强类型 ...

  4. Google Guice之作用域

    默认情况下,Guice获取一个实例时.每次都会返回一个新的对象. 这个行为能够通过scopes进行配置.Scopes同意你复用实例: 应用整个生命周期(@Singleton),会话(@Session) ...

  5. 清除sqlserver日志方法(不适合always on)

    清除sqlserver日志方法 --查看数据库的recovery_model_desc类型 SELECT NAME, recovery_model_desc FROM sys.databases -- ...

  6. CPD轮播广告库的简单算法

    在广告的领域中,有一种广告形式,采用的是CPD的售卖模式,为了对流量进行拆分,媒体方会对广告位进行轮播拆分.比如一个广告位,被拆成了10轮播,那么在广告主来预订广告位的时候,这个时候就可以告诉广告主, ...

  7. JAX-RS(REST Web Services)2.0 can not be installed: One or more constraints have not been satisfied

    eclipse出错: JAX-RS(REST Web Services)2.0 can not be installed: One or more constraints have not been ...

  8. [Jobdu] 题目1530:最长不重复子串

    题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c... ...

  9. About - CONNECT_BY_FILTERING

    再次碰到一个诡异的事情,同样的SQL在两个类似数据库中执行时间相差非常之多.直观反应就是执行计划不一样,果不其然. 在跑得很快的环境中的执行计划, 但是在另外一个环境中的执行计划却是, 从执行计划中可 ...

  10. 微信H5支付.NET版本备忘

    微信H5支付.NET版本备忘