绘制API

首先还是看一下前文的的示例:

args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
    args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);

它使用了DrawingSesion下发绘制命令,和WPF中的DrawingContext差不多,就是一个绘制上下文。它主要的命令分为如下两种:DrawXXX和FillXXX。DrawXXX只是绘制图像,而FillXXX只填充图像,这里和WPF那种绘制和填充在一个API里的方式稍稍有点不同。

由于API并不多,这里列举了一下,基本上看着就知道怎么用了。

  • DrawCircle
  • DrawCachedGeometry
  • DrawEllipse
  • DrawGeometry
  • DrawImage
  • DrawInk
  • DrawLine
  • DrawRectangle
  • DrawRoundedRectangle
  • DrawText。
  • DrawTextLayout
  • FillCircle
  • FillEllipse
  • FillGeometry
  • FillRectangle
  • FillRoundedRectangle

它的API还比较简单,基本上看着就知道怎么用,不过其中的DrawImage能传入一个IcanvasImage类型,而这个类型并不仅仅是图片,包括下面介绍的CanvasCommandList和Effect都是这种类型,使用的时候需要熟悉一下。

2D转换

2D绘图的过程中往往还伴随着一些平移,旋转等2D转换的操作,DrawingSession中提供了一个Transform属性可以传入一个3*2矩阵实现2D转换。

var ds = args.DrawingSession;

ds.Transform = Matrix3x2.CreateTranslation(new
Vector2(200, 100));
    ds.DrawText("A", 0, 0, Colors.White);

ds.Transform *= Matrix3x2.CreateRotation(12, new
Vector2(200,80));
    ds.DrawText("B", 0, 0, Colors.White);

CanvasCommandList

CanvasCommandList可以缓存一组绘制命令,然后统一绘制。它可以用于分块绘制,也可以用于减少重复绘制。

var renderTarget = new
CanvasCommandList(sender);
    using (var clds = renderTarget.CreateDrawingSession())
    {
        clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
        clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
    }

args.DrawingSession.DrawImage(renderTarget);

滤镜效果

Win2D的一个比较给力的特性就是支持滤镜特效,用它可以非常方便的实现常用的模糊、阴影等效果,这里以高斯模糊为例修改下上面的效果。

var cmdList = new
CanvasCommandList(sender);
    using (var clds = cmdList.CreateDrawingSession())
    {
        clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
        clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
    }

var effect = new
GaussianBlurEffect();
    effect.Source = cmdList;

args.DrawingSession.DrawImage(effect);

系统还内置了许多常用的滤镜效果,它们都以Effect结尾,放在Microsoft.Graphics.Canvas.Effects名字空间下。

绘制事件

除了前面用到的绘制的时候触发绘制操作的Draw事件外,还有一个比较常用的事件CreateResource,它在最开始加载控件的时候触发,往往用于初始化各种资源。

另外再来看看Draw事件的触发条件,它基本上和WPF的OnRender差不多,也就是说,一般在初次加载时会触发,改变窗口大小的时候会触发,拖动窗口时不会触发。如果要在后台控制其重绘也比较简单,但用其Invalidate方法即可。

使用Win2D在UWP程序中2D绘图(二)的更多相关文章

  1. 使用Win2D在UWP程序中2D绘图(一)

    在新的Windows UWP程序中,引入了一个新的API库: Win2D.它是一个d2d的封装,可以直接使用C#来快速实现高效2D绘图了.这个API虽然在Win8.1时代就开始着手开发了,但最近才完善 ...

  2. Qt中2D绘图问题总结(一)----------基本的绘制与填充

    刚刚开始学习Qt不久,才开始渐渐地熟悉基础内容,学习过程中的一些知识的总结和感悟希望通过博客记录下来,与大家分享学习的同时,也是对自己坚持下去的鞭策,废话不多说了,开始第一次的小总结吧. Qt提供了强 ...

  3. 在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

    在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接 ...

  4. Qt中2D绘图问题总结(二)----------坐标系统

    坐标系统 使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标. 逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数.QPainter的viewport ...

  5. (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

  6. (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

  7. 【转 | 侵删】2D 绘图技术中的坐标系统与坐标变换

    本文介绍在 2D 绘图技术中的坐标系统和坐标变换的相关知识.同时介绍 Kity 在这方面提供的 API .希望这些知识对于需要进行图形应用开发的同学会有所帮助. 锤子的故事 很久以前,有一个画家,他很 ...

  8. 13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)

    如果在应用中,如果想要给app 添加模糊滤镜,可能第一想到的是第三方类库,比如 Win2d.lumia Imaging SDK .WriteableBitmapEx,不可否认,这些类库功能强大,效果也 ...

  9. Quartz-2D绘图之图形上下文详解

    上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲.这篇文章就先讲讲图形上下文(Graphics Context)的具体操作. 所谓Graphi ...

随机推荐

  1. 一起来学redis(一)

    redis是一个开源的,高性能的,基于键值对的缓存与存储系统通过提供多种键值数据类型来适应不同场景下的缓存与存储需求. 同时redis的诸多高层级功能使其可以胜任消息队列,任务队列等不同的角色. 特性 ...

  2. 2017 CERC

    2017 CERC Problem A:Assignment Algorithm 题目描述:按照规则安排在飞机上的座位. solution 模拟. 时间复杂度:\(O(nm)\) Problem B: ...

  3. VirtualBox与Genymotion命令行启动

    一.VirtualBox命令行启动 1.添加环境变量: %programfiles%\Oracle\VirtualBox 2.用VBoxManage查看已存在vmname|uuid命令: VBoxMa ...

  4. MD5做为文件名。机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧。

    可以采用机器(电脑)唯一码 + 上传IP + 当前时间戳 + GUID ( + 随机数),然后MD5做为文件名.机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能 ...

  5. learnyounode 题解

    //第三题 var fs =require('fs')var path=process.argv[2]fs.readFile(path,function(err,data){ var lines=da ...

  6. DHCP简单配置

    DHCP是什么? DHCP动态主机地址管理协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网内使用的网络协议,最主要的用途是为局域网内部 ...

  7. 基于TCP协议的聊天室控制台版

    我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...

  8. droupout

    当训练样本比较少时,为了防止过拟合,可以丢掉一些节点的连接,让某些隐含层结点不工作(即停止更新权值),采用部分连接的方式. 参考:http://blog.csdn.net/on2way/article ...

  9. 最直白、最易懂的话带你认识和学会---数据分析基础包之numpy的使用

    前言 numpy是一个很基础很底层的模块,其重要性不言而喻,可以说对于新手来说是最基础的入门必须要学习的其中之一.在很多数据分析,深度学习,机器学习亦或是人工智能领域的模块中,很多的底层都会用到这个模 ...

  10. MySQL----示例知识点整理

    示例语句: ),hour(c.created_at) from `behavior_client_view` c join `behavior_share` s on c.share_uuid=s.u ...