文章目录
框架准备
为了演示C#中的图像处理功能,先在xaml中导入一张图片,并且预留出一个WrapPanel,用于存放操作按钮。
xml
<TabControl TabStripPlacement="Left">
<TabItem Header="Bitmap 学习">
<DockPanel LastChildFill="True" >
<WrapPanel DockPanel.Dock="Right" Width="150" Background="#EEEEEE">
</WrapPanel>
<Image Margin="10"
x:Name="img" Source="E:\Pictures\test.jpeg"/>
</DockPanel>
</TabItem>
</TabControl>
整体框架如下
图像转灰度
转灰度往往是图像处理的第一步,其实质是将图像转换为矩阵,从而便于进行像素操作。wpf提供了非常方便的格式转换类,下面新建一个按钮,绑定下面的函数,即可实现图像转灰度的功能
csharp
Bitmap bmp = new BitmapImage(new Uri(@"E:\Pictures\test.jpeg"));
private void btnGray_Click(object sender, RoutedEventArgs e)
{
img.Source = new FormatConvertedBitmap(bmp, PixelFormats.Gray8, null, 0);
}
其中,FormatConvertedBitmap
用于图像格式转换,其输入的4个参数分别是输入图像,图像格式,调色盘以及透明度。由于其继承自BitmapSource,故而可以直接绑定至img.Source中。
点击按钮后,结果如下
像素操作
在转为灰
度之后,图像仍旧以对象的形式存在,而无法直接索引。为此需要新建一个数组,来装载图像的像素,这个数组处理完成后,再把像素值填充进一个新的BitmapSource中。
下面实现一个阈值功能,将灰度值小于128的像素统统置0,实现类似下图的效果
代码如下
cs
private void btnPixel_Click(object sender, RoutedEventArgs e)
{
var src = new FormatConvertedBitmap(bmp, PixelFormats.Gray8, null, 0);
var h = src.PixelHeight; // 图像高度
var w = src.PixelWidth; // 图像宽度
var pixels = new byte[h * w];
src.CopyPixels(pixels, w, 0);
pixels = pixels.Select(x => x>128 ? x : (byte)0).ToArray();
img.Source = BitmapSource.Create(w, h, 96, 96,
PixelFormats.Indexed8, BitmapPalettes.Gray256, pixels, w);
}
其中用到了两个BitmapSource的方法,首先通过CopyPixels将像素赋值给pixels,然后再调用Create来创建。