UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial

时间:2022-12-06 00:05:35

本篇作为技术分享系列的第四篇,详细讲一下手绘视频中 Surface Pen 和 Surface Dial 的使用场景。

先放一张微软官方商城的图,Surface 的使用中结合了 Surface Pen 和 Surface Dial。

UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial

Surface Pen 的使用场景不难想象,就像 iPad 和 Android Pad 配置的笔一样,Surface Pen 也在书写、书画和日常操作中发挥着很重要的作用。微软的 Surface Pro 和 Surface Book 系列中都重点强调了 Surface Pen 的多种用途和便捷性。而在手绘视频中,用户主动创作、体现个性化最重要的部分,就是用户用鼠标、手指触控或 Surface Pen 操作的文字和绘画了,相比鼠标和手指,Surface Pen 无疑是最适合创作的了。

Surface Dial 相对来说会稍微陌生一些,日常工作中很少见到,因为 Surface Pro 和 Surface Book 销售时并不包括它,需要单独购买,所以使用没有那么普及。但是对于艺术创作者,Surface Dial 还是相当好用的,它可以完成很多辅助快捷功能,发挥非主力手的作用,解放你的主力手,如图中所示:右手是主力创作手,专门负责绘画等复杂操作;左手是非主力手,负责一些功能性的辅助操作,比如切换笔的颜色、粗细、放大缩小画布等,另外 Dial 会默认附加一些系统级别的快捷功能,如音量调节,界面滚动等。另外 Dial 的操作分为两种模式:off screen 和 on screen,顾名思义就是屏幕外和屏幕上的功能,目前支持 on screen 功能的只有 Surface Studio,其他设备只能 off screen 操作。on screen 时,圆形菜单会出现在 Dial 的周围,而且会跟随 Dial 移动,操作相当直观,而 off screen 时,圆形菜单会以较小的形式出现。下图分别是 on screen 和 off screen 的模式:

UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial

对 Surface Pen 和 Surface Dial 有一个初步的认识后,我们就开始正式讲一下它们在 UWP 手绘视频创作工具中的应用。

首先是 Surface Pen,它除了可以完成鼠标的操作,如点击等之外;对于手绘视频应用更重要的是,笔记书画的功能。这里我们主要用到了 InkToolbar 和 InkCanvas,InkToolbar 是一个 Ink 工具条,支持自定义按钮,提供多种笔迹/直尺/圆角/橡皮擦等,而 InkCanvas 是用于显示 InkToolbar 选择的画笔绘制出来的笔迹的。这方面有很多文章有过系统的介绍,微软官网也有很多文章:https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/pen-and-stylus-interactions,

在手绘视频中的使用,分为两个步骤:1. InkCanvas 绘制完成后,保存为 Ink 数据;2. 取出 Ink 数据,按照线条长度对拆分,保证每段线条不超过某个阈值,然后把拆分后的 Ink 序列传给 Win2D 去做动态绘制。

以上处理,只针对圆珠笔有效,而针对非圆珠笔,因为存在线条对笔尖角度的变换和半透明颜色的叠加,所以需要做一点处理,如铅笔、钢笔和荧光笔,需要在笔尖变换方向时做形状判断,在线条叠加时做颜色加深;另外针对荧光笔,它对被覆盖的颜色会有荧光的混色效果,实际是把被覆盖颜色修改掉的,需要使用 OpenCV 做混色的计算,还需要注意边缘的平滑处理。

除了系统提供的笔尖,我们也可以自己定义笔尖,这里简单提一下:笔尖有两个重要的属性需要定义,笔尖的形状和它的填充。既包括了笔尖的轮廓,也包括他的填充,如圆珠笔的原型轮廓,钢笔的椭圆形轮廓;圆珠笔的完全不透明填充,铅笔的离散点填充,荧光笔的半透明填充。定义了这些属性后,在 InkCanvas 中书写时,笔尖结合方向,决定了不同方向笔画的形状和不同的粗细,笔尖的填充,决定了在反复涂画时,是否有颜色加深处理。

UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial

接下来是 Surface Dial,它有几种操作:长按,短按和旋转,我们所有的操作都基于这几个操作。Surface Dial 提供了一个 Menu,长按 Dial 后呼出 Menu,我们需要把自定义操作的数据塞进 Menu 里,作为 Menu 的一个 Item,在 Dial 旋转到该 Item 时,短按后进入它的功能。可以是直接执行某些功能,也可以是进去另一个子 Menu。Dial 呼出时的 Menu 样式是不可以自定义的,所以我们如果要自定义 Menu 样式,只能作为子 Menu 出现,如上面 on screen 图所示,这个 Menu 就是一个完全自定义的颜色选择器。

因为子 Menu 可以完全自定义,所以我们可以想一下怎么制作这个 Menu,比如颜色选取,我们用一个圆形供用户旋转,短按后选择某个颜色,长按切换功能;为了兼容 off screen 和 on screen 模式,我们判断到 off 或 on 后,决定圆形的半径,在 off 时小一些,在 on 时留出 Dial 的尺寸。因为 Dial 的旋转操作方式,很多子 Menu 都选择了圆形的方式。

UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial

Ink 和 Dial 的介绍就到这里,我们更多的介绍它的应用场景,具体的实现代码大家可以去微软官方查看文档,实现过程相对简单,不做赘述了,谢谢!

UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial的更多相关文章

  1. UWP 手绘视频创作工具技术分享系列

    开篇先来说一下写这篇文章的初衷. 初到来画,通读了来画 UWP App 的代码,发现里面确实有很多比较高深的技术点,同时也是有很多问题的,扩展性,耦合,性能,功能等等.于是我们决定从头重构这个产品,做 ...

  2. UWP 手绘视频创作工具技术分享系列 - 全新的 UWP 来画视频

    从2017年11月开始,我们开始规划和开发全新的来画Pro,在12月23日的短视频峰会上推出了预览版供参会者体验,得到了很高的评价和关注度.吸取反馈建议后,终于在2018年1月11日正式推出了全新版本 ...

  3. UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频

    AI(Artificial Intelligence)正在不断的改变着各个行业的形态和人们的生活方式,图像识别.语音识别.自然语言理解等 AI 技术正在自动驾驶.智能机器人.人脸识别.智能助理等领域中 ...

  4. UWP 手绘视频创作工具技术分享系列 - 手绘视频导出

    手绘视频最终的生成物是视频文件,前面几篇主要讲的是手绘视频的创作部分,今天讲一下手绘视频的导出问题.主要以 UWP 为例,另外会介绍一些 Web 端遇到的问题和解决方法. 如上所述,手绘视频在创作后, ...

  5. UWP 手绘视频创作工具技术分享系列 - 手绘视频与视频的结合

    本篇作为技术分享系列的第三篇,详细讲一下手绘视频中结合视频的处理方式. 随着近几年短视频和直播行业的兴起,视频成为了人们表达情绪和交流的一种重要方式,人们对于视频的创作.编辑和分享有了更多的需求.而视 ...

  6. UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制

    本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持. 首先我们来看一下 SVG 的文件结构和组成 SVG ( ...

  7. UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制

    本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...

  8. UWP 手绘视频创作工具技术分享系列 - 位图的绘制

    前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的图片是:位图,包括 png.jpeg.bmp 等格式.位图的基本规则是,组成的基本元素是像素点,由宽度 * 高度个 ...

  9. UWP 手绘视频创作工具 “来画Pro” 技术分享系列

    开篇先来说一下我和来画的故事,以及写这篇文章的初衷. 今年年初时,我还在北京,在 Face++,做着人脸识别技术的 Windows 和 Android 端,做着人工智能终将实现世间所有美好的梦.这时的 ...

随机推荐

  1. notepad++ 正则表达式

    body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...

  2. OC学习1

    分类: 1 如果在分类中增加一个原有类同名的方法,新方法分覆盖原有类的方法 (哪怕没有导入这个分类) 2 多个分类中有相同的方法,会执行最后编译的方法: 3 分类中不可以添加成员变量: 4 @prop ...

  3. Lessons learned from manually classifying CIFAR-10

    Lessons learned from manually classifying CIFAR-10 Apr 27, 2011 CIFAR-10 Note, this post is from 201 ...

  4. linux源码阅读笔记 fork函数

    在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork ...

  5. java Map使用Object 做为Key的问题

    近期在看dnsjava 源码的时候,不经意间发现一个自己没有想过的问题: HashMap 如何使用key去查找对应的value的,这个问题很难用语言描述的清楚,那就使用代码来进行说明吧! public ...

  6. Qt 学习之路:存储容器

    存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特定类型的对象,通常是一些常用的数据结构,一般是通用模板类的形式.C++ 提供了一套完整的解决方案, ...

  7. python3.4+selenium爬58同城(一)

    爬取http://bj.58.com/pbdn/0/pn2/中除转转.推广商品以外的产品信息,因为转转和推广的详情信息不规范,需要另外写一个方法存放,后期补上,详情页如下 这周学习了爬虫,但是遇到一些 ...

  8. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  9. 基于python3.x,使用Tornado中的torndb模块操作数据库

    目前Tornado中的torndb模块是不支持python3.x,所以需要修改部分torndb源码即可正常使用 1.开发环境介绍 操作系统:win8(64位),python版本:python3.6(3 ...

  10. Android Call requires API level 19 (current min is 15)

    在 Android 应用开发时候,配置文件中声明了支持的Android系统范围: minSdkVersion 15targetSdkVersion 27 但是代码中需要使用的一个类 (android. ...