WPF图像处理之像素操作

news/2024/7/21 4:57:58 标签: wpf, 图像处理, 人工智能, 像素操作, bitmap, 位图, C#

文章目录

WPF Image控件的初步使用

框架准备

为了演示C#中的图像处理功能,先在xaml中导入一张图片,并且预留出一个WrapPanel,用于存放操作按钮。

<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提供了非常方便的格式转换类,下面新建一个按钮,绑定下面的函数,即可实现图像转灰度的功能

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,实现类似下图的效果

代码如下

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来创建。


http://www.niftyadmin.cn/n/5236453.html

相关文章

什么是中间人攻击

中间人攻击 1. 定义2. 中间人攻击如何工作3. 常见中间人攻击类型4. 如何防止中间人攻击 1. 定义 中间人攻击&#xff08;Man-in-the-Middle Attack&#xff0c;简称MITM&#xff09;&#xff0c;是一种会话劫持攻击。攻击者作为中间人&#xff0c;劫持通信双方会话并操纵通信过…

普通策略梯度算法原理及PyTorch实现【VPG】

有没有想过强化学习 (RL) 是如何工作的&#xff1f; 在本文中&#xff0c;我们将从头开始构建最简单的强化学习形式之一 —普通策略梯度&#xff08;VPG&#xff09;算法。 然后&#xff0c;我们将训练它完成著名的 CartPole 挑战 — 学习从左向右移动购物车以平衡杆子。 在此…

黑客帝国.html(网上收集7)

<!doctype html> <html> <head><meta charset"utf-8" /><title>流星雨</title><meta name"keywords" content"关键词&#xff0c;关键字"><meta name"description" content"描述信…

Day49力扣打卡

打卡记录 需要添加的硬币的最小数量&#xff08;归纳法&#xff09; 链接 按着已经加入的数&#xff0c;以此偏移对应距离&#xff0c;从而得到新的连续数&#xff0c;若是出现断层则计入最小次数中&#xff0c;再以此偏移对应距离。 class Solution:def minimumAddedCoins(s…

蓝桥杯ACwing习题

https://www.acwing.com/problem/content/description/4312/ // 首先 我们可以很容易的知道这道题是判断有多少个斜率 // 在直接一点就是将所有斜率相等的认为是一个就可以了 // 然后我们就可以想到 set 存一下 , 然后去重就可以了 // 我们需要知道的是 当我们求出当前这个点的…

vitepress的使用

创建项目并启动项目 // 1.创建项目,直接在空项目下安装vitepress(npm/yarn等都可以,这个可以看官网,官网给了好几种安装方式) yarn add -D vitepress // 2.初始化配置项目(npm/官网也给了多种包管理工具的安装方式) npx vitepress init // 初始化命令执行完会遇到以下几个问题…

Apache solr XXE 漏洞(CVE-2017-12629)

任务一&#xff1a; 复现环境中的漏洞 任务二&#xff1a; 利用XXE漏洞发送HTTP请求&#xff0c;在VPS服务器端接受请求&#xff0c;或收到DNS记录 任务三&#xff1a; 利用XXE漏洞读取本地的/etc/passwd文件 1.搭建环境 2.开始看wp的时候没有看懂为什么是core&#xff0c;然…

WPS开发文档

WPS官网的WPS开放平台开发文档&#xff0c;摘抄一些以记录及作为文档的入口记录&#xff0c;以后对WPS表格的操作编程再也不是从网上搜索到的只字片语了^_^。 Workbook.SaveAs 在另一不同文件中保存对工作簿所做的更改。 语法 express.SaveAs(Filename, FileFormat, Passwo…