墨迹处理(InkCanvas)
InkCanvas是一种特殊控件,在应用程序运行后,它不会呈现任何内容,不过,它可以收集用户通过鼠标、手指或笔所输入的数据,这些数据称为"墨迹(Inking)"。只要用户的输入操作是在InkCanvas控件的区域内,它就可以收集输入的墨迹。
InkCanvas控件公开InkPresenter属性,类型是位于Windows.UI.Input.Inking命名空间下的InkPresenter类。这个类用于配置墨迹收集相关的参数,例如墨迹的呈现颜色,呈现大小等。每当InkCanvas控件完成一次墨迹收集时会引发StrokesCollected事件。
为了便于开发,通常InkCanvas控件会与InkToolbar控件结合使用。InkToolbar会呈现一系列操作按钮,包括设置笔触颜色、粗细等操作,开发者不需要自行开发操作按钮。
InkCanvas控件除了有"涂鸦"功能外,还可以用来实现手写识别。InkRecognizerContainer类负责完成识别操作,识别成功后会得到一个InkRecognitionResult列表,表示识别结果。其中每个InkRecognitionResult对象会包含一个候选集合,集合按照被识别文字的精确程度进行排序。
接下来将通过示例来综合演示一下墨迹收集和手写识别。
- 新建应用程序项目、
- 界面布局可以参考下面XAML代码来完成。
<Grid Margin="20"><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/><RowDefinition Height="auto"/></Grid.RowDefinitions><InkToolbar x:Name="inkToolBar"/><InkCanvas x:Name="inkcvs" Grid.Row="1" Margin="0,5"/><ListView x:Name="lvResults" Header="识别结果:" Grid.Row="2" FontSize="20"ScrollViewer.HorizontalScrollMode="Auto" ScrollViewer.HorizontalScrollBarVisibility="Hidden"><ListView.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Horizontal"/></ItemsPanelTemplate></ListView.ItemsPanel><ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="FontSize" Value="24"/><Setter Property="Foreground" Value="Green"/></Style></ListView.ItemContainerStyle></ListView></Grid>
InkToolbar控件在默认情况下会呈现如钢笔、圆珠笔、橡皮擦等工具按钮,用户不仅可以选择合适的笔头,还可以设置笔触的颜色和大小。InkCanvas面板提供一个矩形区域,用户只能在该区域完成墨迹输入。本示例将顺带地演示手写识别功能,当用户进行输入后,等待2秒钟,应用程序会完成识别,并将结果呈现在ListView控件中。
3. 打开MainPage类的代码文件,在类级别声明以下字段。
InkRecognizerContainer recognizerContainer = null;DispatcherTimer timer = null;IReadOnlyList<InkRecognizer> recognizers;
InkRecognizerContainer类负责进行手写识别,DispatcherTimer类用于计时,在用户输入完成后开始计时,延迟识别操作。
4. 在类的构造函数中,对各个对象进行初始化。
public MainPage(){this.InitializeComponent();//将InkCanvas与InkToolbar关联inkToolBar.TargetInkCanvas = inkcvs;//设置墨迹面板支持鼠标、触摸和笔输入inkcvs.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse |CoreInputDeviceTypes.Touch | CoreInputDeviceTypes.Pen;inkcvs.InkPresenter.StrokesCollected += OnStrokeCollected;inkcvs.InkPresenter.StrokeInput.StrokeStarted += OnStrokeStarted;recognizers = new List<InkRecognizer>();//初始化 InkRecognizerContainerrecognizerContainer = new InkRecognizerContainer();//获取已安装的手写识别器集合recognizers = recognizerContainer.GetRecognizers();var recognizer = recognizers.SingleOrDefault(r => r.Name == "Microsoft 中文(简体)手写识别器");recognizerContainer.SetDefaultRecognizer(recognizer);//初始化 DispatcherTimertimer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(2d);timer.Tick += OnTimerTick;}
要让InkToolbar和InkCanvas协同工作,则必须让InkToolbar对象的TargetInkCanvas属性引用一个有效的InkCanvas实例。
设置InputDeviceTypes属性,让应用程序支持鼠标、手写触摸以及触控笔来进行输入。属性值由CoreInputDeviceTypes枚举来定义,可以多个值组合使用。
处理StrokeStarted事件是为了在用户开始输入时禁用计时器,在用户未完成输入时进行手写识别意义不大;然后还要处理StrokesCollected事件,当墨迹面板完成一次墨迹收集后启动计时器,如果2秒钟内用户不再进行输入,就会引发计时器的Tick事件,并执行手写识别。
5. 下面是StrokeStarted事件的处理代码,功能是禁用计时器。。
void OnStrokeStarted(InkStrokeInput sender,PointerEventArgs args){if (timer.IsEnabled){timer.Stop();}}
6. 下面代码处理StrokesColelcted事件,重新开始计时器。
void OnStrokeCollected(InkPresenter sender,InkStrokesCollectedEventArgs args){timer.Start();}
7. 处理Tick事件是本示例的核心,调用recognizerContainer字段的RecognizeAsync方法执行手写识别,最后将识别结果显示到ListView控件中。
async void OnTimerTick(object sender, object e){//获取收集的笔触列表var strokes = inkcvs.InkPresenter.StrokeContainer.GetStrokes();//当集合中包含有笔触时才进行识别if (strokes.Count > 0){var results = await recognizerContainer.RecognizeAsync(inkcvs.InkPresenter.StrokeContainer,InkRecognitionTarget.All);//显示识别结果if (results.Count > 0){//获取第一个识别结果InkRecognitionResult firstresult = results[0];lvResults.ItemsSource = firstresult.GetTextCandidates();//清空笔触集合inkcvs.InkPresenter.StrokeContainer.Clear();}}//停止计时timer.Stop();}
RecognizeAsync方法会返回多个识别结果,在本例中,只获取第一个结果进行分析。开发者应当根据实际情况来获取需要的识别结果。在单个InkRecognitionResult对象中,可以调用GetTextCandidates方法来得到一个字符串列表,该列表表示被识别文本的候选项,系统会按精确度对候选项进行排序。
至此,示例应用程序已经完成,运行示例后,在InkCanvas面板中通过墨迹输入文字,就可以进行识别了。
墨迹处理(InkCanvas)相关推荐
- win10 uwp 使用油墨输入
win10可以很简单在我们的app使用自然输入,这篇文章主要翻译https://blogs.windows.com/buildingapps/2015/09/08/going-beyond-keybo ...
- 2018-4-12-win10-uwp-使用油墨输入
title author date CreateTime categories win10 uwp 使用油墨输入 lindexi 2018-04-12 14:19:58 +0800 2018-2-13 ...
- 【Win 10 应用开发】将墨迹保存到图像的两种方法
IT界最近这几年,各种乱七八糟的东西不断出现,其中能用在实际工作与生活中的,大概也就那么几个.Web 前端也冒出各种框架,这就为那些喜欢乱用框架的公司提供了很好的机会,于是造成很多项目体积越来越庞大, ...
- WPF and Silverlight 学习笔记(九):WPF布局管理之Canvas、InkCanvas
一.Canvas 在WPF中子元素的绝对定位的布局控件 其子元素使用Width.Height定义元素的宽度和高度 使用Convas.Left(Convas.Right).Convas.Top(Conv ...
- 基于InkCanvas实现的桌面涂鸦工具-[ WPF开发 ]
首先简单的介绍下InkCanvas,简单的来说,InkCanvas就是在WPF中实现允许使用墨迹的布局控件.实际上,InkCanvas有着更多层面上的应用,它的主要目的是(通过鼠标或者和指示笔)捕捉笔 ...
- Azure认知服务之使用墨迹识别功能识别手写汉字
前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...
- WPF 使用Microsoft.Ink 做的墨迹输入法
利用微软的Ink,实现手写输入. 不用自带的InkCanvas,重写的绘制的效果. 根据速度调节线条粗细了.其实不算是线条吧,PathGeometry对象. 然后再向Ink引擎传入笔画数据,其实就是点 ...
- WPF实现WORD 2013墨迹批注功能
原文:WPF实现WORD 2013墨迹批注功能 1 前言 WORD 2013可以使用墨迹在文档上面标注,本文讲述通过WPF第三方控件实现类似主要功能如下: 名称 描述 墨迹标注 不论是否触摸屏环境下可 ...
- 墨迹天气: 更重视商业数据的公共价值
[在中国,墨迹天气所涉及的天气数据细化到了城市行政区域.县级.村.街道的级别,也就是说,在同一个城市的不同位置不同时间,用户也可以看到跟自己更贴近的天气情况,准确率超过80%.] 当你推着满满一车物品 ...
最新文章
- python 2x list 里面的中文打印效果为unicode 编码 的处理方法
- 观点 | 通往通用人工智能的路上,我们少不了无监督学习
- python可以播放音乐吗_详解python播放音频的三种方法
- mysql基于binlog增量更新_一个应用它提取MySQL binlog,解析binlog并将增量更新数据推送到不同的接收器...
- linux-history历史命令-光标的移动操作-命令行上的字符删除操作
- 白话 discuz加密解密算法,包你懂
- 技术圈几个牛逼的公号推荐给大家
- 如何使用jstack?线程的状态?
- Atitit 单点登录实现几种模式架构图 目录 1. 因此要点也就以下两个:存储信任验证信任	1 1.1. 共享cookie (最简单	1 1.2. 通过 url带token参数跳转	1 1.3.
- php tcpdf 分层,PHP 使用tcPdf 生成pdf文件
- QThread安全退出
- 厉害了,大米云Linux搭建Wordpress环境
- Vue3.0后台管理框架
- 冒险岛手游服务器维护界面,冒险岛手游游戏界面全解 丰富轻松画风
- 邮件服务器搭建 iredmail
- Unity3D延迟执行功能脚本
- 密码的输入问题(do while()和st1.equals(st2)的使用)
- html 左侧固定导航栏,前端布局-固定导航栏与侧边栏
- JS中改变this指向的两种方法
- 智商太低,竟然算不出病狗神题了