Win10/UWP开发-Ink墨迹书写

在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记。

InkCanvas控件使用很简单,从工具箱里拖出一个InkCanvas控件即可,InkCanvas有个属性叫InkPresenter,通过它我们可以多样化的设置我们的画笔属性,InkPresenter里面有几个重要的属性:

 1 // 获取或设置输入数据用于从中提取 InkStroke 的输入设备类型。
 2
 3 public CoreInputDeviceTypes InputDeviceTypes { get; set; }
 4
 5
 6 // 获取 InkCanvas 控件上的 InkStroke 的行为。例如,墨迹、清除或选择。
 7
 8 public InkInputProcessingConfiguration InputProcessingConfiguration { get; }
 9
10
11 // 获取或设置是否已启用输入以进行墨迹书写。
12
13 public System.Boolean IsInputEnabled { get; set; }
14
15
16 // 获取或设置 InkStrokeContainer 对象以管理 InkCanvas 控件上的一个或多个 InkStroke 对象的输入、处理和操作。
17
18 public InkStrokeContainer StrokeContainer { get; set; }
19
20
21 // 从关联的 InkCanvas 控件获取笔划墨迹输入。
22
23 public InkStrokeInput StrokeInput { get; }
24
25
26 // 设置 InkCanvas 控件上一个或多个接触点的墨迹书写行为。
27
28 public void SetPredefinedConfiguration(InkPresenterPredefinedConfiguration value);
29
30
31 // 指定渲染新的 InkStroke 时 InkCanvas 控件所使用的 InkDrawingAttributes。
32
33 public void UpdateDefaultDrawingAttributes(InkDrawingAttributes value);

接下来我们做一个画图板,功能要实现墨迹书写,墨迹擦除,墨迹保存,墨迹加载,手写识别。

墨迹书写

前台声明一个InkCanvas控件:

<InkCanvas x:Name="InkCanvas" />

后台设置下Ink的墨笔属性:

 1 private void MainPage_Loaded(object sender, RoutedEventArgs e)
 2 {
 3     //设置输入类型为触控输入和鼠标输入
 4     InkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Touch;
 5     //创建一个新的画笔属性(此步可省略,省略后采用默认画笔)
 6     var attr = new InkDrawingAttributes
 7     {
 8         Color = Colors.Red, //颜色
 9         IgnorePressure = true,  //是否忽略数字化器表面上的接触压力
10         PenTip = PenTipShape.Rectangle, //笔尖类型设置
11         Size = new Size(4, 10), //画笔粗细
12         PenTipTransform = Matrix3x2.CreateRotation((float)(70 * Math.PI / 180)) //笔尖形状矩阵
13     };
14     //更新画笔
15     InkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(attr);
16 }

墨迹擦除

墨迹擦除只需要设置画笔行为为橡皮擦即可

    InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Erasing;

墨迹保存

 1 private async void Btn_Save_OnClick(object sender, RoutedEventArgs e)
 2 {
 3     //声明一个流来存储墨迹信息
 4     IRandomAccessStream stream = new InMemoryRandomAccessStream();
 5     //保存墨迹信息到流
 6     //拿到流了就可以随意处置墨迹了,可以保持到App内部 也可以保存为文件,我们直接保存为文件
 7     await InkCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);
 8     //创建一个文件保存对话框
 9     var picker = new Windows.Storage.Pickers.FileSavePicker
10     {
11         SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary
12     };
13     //文件类型
14     picker.FileTypeChoices.Add("INK files", new List<string>() { ".ink" });
15     //弹出保存对话框
16     var file = await picker.PickSaveFileAsync();
17     if (file == null) return;
18
19     CachedFileManager.DeferUpdates(file);
20     //将流转为byte
21     var bt = await ConvertImagetoByte(stream);
22     //写入文件
23     await Windows.Storage.FileIO.WriteBytesAsync(file, bt);
24     //保存
25     await CachedFileManager.CompleteUpdatesAsync(file);
26 }
27 private async Task<byte[]> ConvertImagetoByte(IRandomAccessStream fileStream)
28 {
29     //IRandomAccessStream fileStream = await image.OpenAsync(FileAccessMode.Read);
30     var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));
31     await reader.LoadAsync((uint)fileStream.Size);
32
33     byte[] pixels = new byte[fileStream.Size];
34
35     reader.ReadBytes(pixels);
36
37     return pixels;
38 }

墨迹加载

 1 private async void Btn_load_OnClick(object sender, RoutedEventArgs e)
 2        {
 3            //创建一个文件选择器
 4            var picker = new Windows.Storage.Pickers.FileOpenPicker
 5            {
 6                SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary
 7            };
 8            //规定文件类型
 9            picker.FileTypeFilter.Add(".ink");
10            //显示选择器
11            var pickedFile = await picker.PickSingleFileAsync();
12            if (pickedFile != null)
13            {
14                var file = await pickedFile.OpenReadAsync();
15                //加载墨迹
16                await InkCanvas.InkPresenter.StrokeContainer.LoadAsync(file);
17            }
18        }

手写识别

手写识别是指通过用户使用画笔写出的墨迹,我们可以识别出是什么内容,主要是通过InkRecognizerContainer类来完成的。

InkRecognizerContainer类有几个主要方法:

// 获取 InkRecognizer 对象的集合。
public IReadOnlyList<InkRecognizer> GetRecognizers();

// 对一个或多 InkStroke 对象执行手写识别。
public IAsyncOperation<IReadOnlyList<InkRecognitionResult>> RecognizeAsync(InkStrokeContainer strokeCollection, InkRecognitionTarget recognitionTarget);

// 设置用于手写标识的默认 InkRecognizer。
public void SetDefaultRecognizer(InkRecognizer recognizer);

具体使用方法:

 1 private async void btnOcr_OnClick(object sender, RoutedEventArgs e)
 2 {
 3     //手写识别
 4     var container = new InkRecognizerContainer();
 5     //使用墨迹识别
 6     var result = await container.RecognizeAsync(InkCanvas.InkPresenter.StrokeContainer, InkRecognitionTarget.All);
 7     //获取识别结果  InkRecognitionResult 对象中还能获取候选字
 8     var txt = result[0].GetTextCandidates()[0];
 9
10     var dia = new ContentDialog()
11     {
12         Content = new TextBlock() { Text = txt },
13         PrimaryButtonText = "ok",
14         IsPrimaryButtonEnabled = true
15
16     };
17     dia.PrimaryButtonClick += (s, a) =>
18     {
19         dia.Hide();
20     };
21     await dia.ShowAsync();
22 }

Ink Toolbar control

上面介绍了Ink控件的基本使用方法,其中最主要的就是画笔属性的设置,为了方便大家的开发,微软还提供了一个辅助Control叫做Ink Toolbar,通过它,我们可以很方便的集成一个画笔设置工具栏。

首先安装该工具扩展,然后引用InkToolbar Control.dll,接着在View中声明控件:

xmlns:ink="using:Microsoft.Labs.InkToolbarControl"

<ink:InkToolbar x:Name="bar_InkTool"

TargetInkCanvas="{x:Bind InkCanvas}"

VerticalAlignment="Top" HorizontalAlignment="Right" />

TargetInkCanvas属性bind到要设置的InkCanvas上即可。

效果图:

推荐一个UWP开发群:53078485 大家可以进来一起学习

时间: 2024-10-12 12:48:03

Win10/UWP开发-Ink墨迹书写的相关文章

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错. 为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时候是基于

Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

原文:Win10 UWP开发系列--开源控件库:UWPCommunityToolkit 在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在Github上:https://github.com/Microsoft/UWPCommunityToolkit 包括以下几个类库: 都可以很方便的从Nuget上安装. NuGet Package Name des

Win10/UWP开发—使用Cortana语音与App后台Service交互

上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比调用前台的App,调用后台任务有个有点就是App不用被启动即可为用户提供服务. 要想使用Cortana调用App后台任务,首先我们需要定义VCD文件,我们依旧使用上篇中的代码,让它支持Cortana调用后台任务. 创建后台任务 新增一个[Windows运行时组件]项目,暂时起名叫做:XiaoMiBa

Win10 UWP开发系列:实现Master/Detail布局

在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn997765.aspx 样式如下: 在微软官方的Sample里,有这种样式的代码示例,下载地址:https://github.com/Microsoft/Windows-univ

Win10 UWP开发实现Bing翻译

微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Windows通用应用平台,在Win 10 Mobile/Surface(Windows平板电脑)/PC/Xbox/HoloLens等平台上运行,uwp不同于传统pc上的exe应用也跟只适用于手机端的app有本质区别.它并不是为某一个终端而设计,而是可以在所有windows10设备上运行. 简单的说,u

Win10/UWP开发—使用Cortana语音指令与App的前台交互

Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调用App 的App Service.当然App Service也是Win10 App的新特性之一,通过调用App Service就可以在App没有前台运行的时候为Cortana提供数据交互.这样一来Cortana就具有了两种App交互方式: Cortana语音指令与前台App的交互 Cortana语

Win10/UWP开发—凭据保险箱PasswordVault

PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么是凭据保险箱呢?简单的说就是开发者可以在用户输入完凭证(一般是用户名和密码),凭证有效的情况下将该凭证存储在叫做"凭据保险箱"里,该凭据保险箱里的用户凭据将会自动漫游到用户设备的Windows账户中并随时能够再次被App获取. 例如:有一个UWP的App运行在PC上,某用户在使用该App时

Win10 UWP 开发系列:使用SQLite

在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中,可以使用SQLite.本篇文章说一下如何在UWP中使用SQLite.因为SQLite是跨平台的,版本众多,我刚开始用的时候不知道要装哪个,什么WP8的.WP8.1的.Win RT的……简直摸不着头脑.希望这篇文章能让大家少走点弯路. 其实这篇文章写到一半就看到已经有大神写了这个:http://ww