UWP 手绘视频创作工具技术分享系列 - 位图的绘制
前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的图片是:位图,包括 png、jpeg、bmp 等格式。位图的基本规则是,组成的基本元素是像素点,由宽度 * 高度个像素组成,每个像素存储了一个点的颜色和位置信息,颜色信息可以是 ARGB、RGBA、BGR 或 YUV 等组成。在手绘视频中,位图也是一种很重要的表现形式,因为我们在网上下载的图片,或者自己拍摄的照片,都是位图形式,我们可以用它来做成相册类型的视频等等。下面看一个用户使用来画Pro制作的视频中的截图,用户制作的是一个旅游方面的视频,每个景点的图片都是位图,人物也有一部分位图,这就是位图在手绘视频中的一种表现形式:

下面来详细介绍一下位图在手绘视频中的普通绘制方式:
一般来讲,如果对于位图的处理会简单粗暴一些,就是采用一种默认的方式,而不是图片信息包含的路径数据(因为位图本身没有路径数据),来绘制位图,比如从位图的左上角开始,按照固定的间隔绘制直至位图的右下角完毕。绘制过程效果如下图:

我们看到上面一张 png 位图的绘制过程,从左上角开始,以某个角度的倾斜完成左到右的画笔描绘,而以另一个相近的角度完成从右到左的画笔绘制,最终到完成整个位图的绘制。而这整个过程的处理流程和示意图如下:


其中,初始化图片资源和动画路径数据,分别用到 CanvasBitmap 和 CanvasGeometry;而转换绘制动画路径的点集使用 CanvasGeometry.ComputePointOnPath(float distance),最终得到的 distance 就是绘制的总长度;而绘制过程使用的是 CompositeEffect。
以上是所谓简单粗暴的处理方式,作为一个 bige 高的专业工具,怎么可能没有专业的处理方式呢,往下看:
在应用内,我们提供了两种方式来获取位图的路径数据,一种是利用 OpenCV 获取图片的物体边缘数据,另一种是让用户自己定义想以怎样的路径描绘位图。
第一种很容易理解,首先膜拜一下 OpenCV,计算机视觉方面的神器,我们这里使用的就是 OpenCV 的边缘检测方法,它和图像平滑算法相反,是一种“高通滤波器”,去检测图像中像素跨度很大的点组成的边缘,例如物体景观的深度不连续,多面体表面方向的不连续,光照和阴影的临界,物体表面材质不一致的临界等,使用的方法有 Sobel,Laplacian 和 Canny,我们使用的是 Canny,效果如下图:

位图按照检测到的边缘路径一点点描绘出来,只有路径划过的地方才显示位图,这样就有了路径描绘的视觉感受。其实这也是画师在素材制作中一种很常见的方式,在 PS 中处理静态图片的特效,处理完成后保存导入到 AI 中,在静态图片上面描画透明路径,描绘完成后保存成 SVG 文件。这就是一种比较特殊的 SVG,包含了一张位图作为底图,而透明路径的作用,是在路径描绘时,显示路径对应位置的位图像素。
另外一种方式,更多的由用户自己来操作实现,相当于把我们的应用当作 AI,用户自己准备的静态图片,放到应用中进行上面所说的路径描绘,然后直接导入到应用内作为 SVG 使用。应用的界面和操作如下:

上面图1是用户操作界面,用户可以指定画笔的粗细来描绘路径,描绘完成后,会以图2到图3的过程来描述位图。如图1中我们指定的路径是先画头像的边框,再用粗的画笔描绘头像的填充,就如图2和图3的过程一样。
上述的两种处理方式,一个是由系统来检测位图的边缘,另一个是由用户来指定边缘,我们计划把两种方式结合在一起,先由系统检测,再由用户补充和纠正,这样可以减少用户操作的难度,因为有些位图的边缘会很复杂。另外系统检测的一个缺点就是,边缘路径是完全无序,没有分组的,就是说路径不会按照物体的区别分组绘制,也不会按照某个固定顺序绘制,这都需要我们后续再去处理,根据边缘路径的相连属性去分组,在根据方向上的某个顺序去处理排序,当然这还是一种简单粗暴的处理方法。更深一层的处理,应该是检测边缘时,识别物体分类,也就是物体是什么?然后根据这些信息分组和按照分类去排序。这些都是我们后面要做的事情。
位图的处理方式就介绍到这里了,如果大家有好的处理方法,或者有好的想法,欢迎联系我,感谢!
UWP 手绘视频创作工具技术分享系列 - 位图的绘制的更多相关文章
- UWP 手绘视频创作工具技术分享系列
开篇先来说一下写这篇文章的初衷. 初到来画,通读了来画 UWP App 的代码,发现里面确实有很多比较高深的技术点,同时也是有很多问题的,扩展性,耦合,性能,功能等等.于是我们决定从头重构这个产品,做 ...
- UWP 手绘视频创作工具技术分享系列 - 全新的 UWP 来画视频
从2017年11月开始,我们开始规划和开发全新的来画Pro,在12月23日的短视频峰会上推出了预览版供参会者体验,得到了很高的评价和关注度.吸取反馈建议后,终于在2018年1月11日正式推出了全新版本 ...
- UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频
AI(Artificial Intelligence)正在不断的改变着各个行业的形态和人们的生活方式,图像识别.语音识别.自然语言理解等 AI 技术正在自动驾驶.智能机器人.人脸识别.智能助理等领域中 ...
- UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial
本篇作为技术分享系列的第四篇,详细讲一下手绘视频中 Surface Pen 和 Surface Dial 的使用场景. 先放一张微软官方商城的图,Surface 的使用中结合了 Surface Pen ...
- UWP 手绘视频创作工具技术分享系列 - 手绘视频导出
手绘视频最终的生成物是视频文件,前面几篇主要讲的是手绘视频的创作部分,今天讲一下手绘视频的导出问题.主要以 UWP 为例,另外会介绍一些 Web 端遇到的问题和解决方法. 如上所述,手绘视频在创作后, ...
- UWP 手绘视频创作工具技术分享系列 - 手绘视频与视频的结合
本篇作为技术分享系列的第三篇,详细讲一下手绘视频中结合视频的处理方式. 随着近几年短视频和直播行业的兴起,视频成为了人们表达情绪和交流的一种重要方式,人们对于视频的创作.编辑和分享有了更多的需求.而视 ...
- UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制
本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持. 首先我们来看一下 SVG 的文件结构和组成 SVG ( ...
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...
- UWP 手绘视频创作工具 “来画Pro” 技术分享系列
开篇先来说一下我和来画的故事,以及写这篇文章的初衷. 今年年初时,我还在北京,在 Face++,做着人脸识别技术的 Windows 和 Android 端,做着人工智能终将实现世间所有美好的梦.这时的 ...
随机推荐
- 整个IT界可分为13块大领域
IT界可以划分为13个领域 Location: NanJing
- MPLS VPN随堂笔记3
跨域 ASBR之间运行MPBGP 1.配置AS内部IGP保证环回口互相可达,同时建立LDP邻居 (优先启用 mpls label rang 16 100)方便查看实验现象 2.配置PE1-PE2 PE ...
- Python中os和shutil模块实用方法集锦
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- NET Core度身定制的AOP框架
NET Core度身定制的AOP框架 多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码 ...
- js中防止全局变量被污染的方法
(function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...
- 1~N任意三个数最大的最小公倍数(Java版)
最大最小公倍数 如题 话不多说,直接上代码 public class MaxCommonMultiple{ public static void main(String[] args) { Scann ...
- 201521123003《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源 ...
- 201521123070 《JAVA程序设计》第14周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现 ...
- 个人-GIT使用方法
团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 1.Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索 ...
- ThreadLocal原理及使用示例
简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblog ...