本文为个人博客备份文章,原文地址:

http://validvoid.net/win2d-offscreen-drawing/

应用有时需要将图形绘制到并不立即显示的目标上。此类绘制动作被称作“幕后绘制”或“绘制到纹理”。当应用需要将绘制操作输出保存到一个文件、返回为一个像素数组或留作后续操作的输入源时,常需要进行这种幕后绘制。

通过使用 Win2D 中的 CanvasRenderTarget 可以轻松实现以上场景。

CanvasRenderTarget 派生自 CanvasBitmap ,包含一个名为 CreateDrawingSession()的方法。是用 CreateDrawingSession 方法可以把图形内容绘制到一个 CanvasRenderTarget。例如:

CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget offscreen = new CanvasRenderTarget(device, width, height, );
using (CanvasDrawingSession ds = offscreen.CreateDrawingSession())
{
ds.Clear(Colors.Black);
ds.DrawRectangle(, , , , Colors.Red);
}

注意上述示例中调用了一个 Clear 方法。不调用此方法,位图则会以未定义内容进行初始化。通过 CanvasRenderTarget 创建的绘图会话 (drawing sessions) 与 Win2D 提供的 XAML 控件创建的绘图会话对 Clear (清除)行为的处理是不同的。这种差异使得应用可以对(多个) CanvasRenderTarget 进行增量修改,而不必每次都重绘整个场景。

要把一个 CanvasRenderTarget 绘制到另一个绘制会话上,只需调用DrawImage(ICanvasImage) 方法或其任意一个重载即可。例如:

void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawImage(offscreen, , );
}

CanvasRenderTarget 继承了 IGraphicsEffectSource 接口,因此还可以把一个 CanvasRenderTarget 作为输入源,传入到一个特效 (Effect)进行使用。例如:

GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Source = offscreen,
BlurAmount = 3.0f
};

应用能够在一个 CanvasRenderTarget 上多次反复关闭、重开(多个)绘制会话。

在绘制会话对象被释放之前,绘制操作都不会应用到 CanvasRenderTarget。在 C# 里,使用 using 语句块就能妥善处理这一问题。

另外值得一提的是 CanvasRenderTarget 并不是一个 XAML 控件,它与 XAML 元素树完全无关。因此它适用于任何 XAML 或非 XAML 应用。

Win2D 官方文章系列翻译 - 幕后绘制的更多相关文章

  1. Win2D 官方文章系列翻译 - DPI (每英寸点数)和 DIPs(设备独立像素)

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-dpi-dips/ 本文旨在解释物理像素与设备独立像素(DIPs, device independent pi ...

  2. Win2D 官方文章系列翻译 - 预乘 Alpha

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-premultiplied-alpha/ 在计算机绘图中有两种表示颜色值不透明度的方法.Win2D 中两种方法 ...

  3. Win2D 官方文章系列翻译 - 像素格式

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-pixel-formats/ DirectXPixelFormat 枚举 包含了 Direct3D 和 DXG ...

  4. Win2D 官方文章系列翻译 - 调整控件分辨率

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-choosing-control-resolution/ 本文旨在讲解如何配置 Win2D XAML 控件使用 ...

  5. Win2D 官方文章系列翻译 - 处理设备丢失

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-handling-device-lost/ “设备丢失”是指 GPU 设备失效无法继续进行渲染的情况.GPU ...

  6. Win2D 官方文章系列翻译 - 避免内存泄漏

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-avoiding-memory-leaks/ 在托管 XAML 应用中使用 Win2D 控件时,必须谨慎处理对 ...

  7. Win2D 官方文章系列翻译 - 与 Direct2D 互操作

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-interop-with-direct2d/ Win2D 作为 Direct2D 的上层实现,支持与其进行双向 ...

  8. NLog文章系列——如何配置NLog(转)

    NLog使用方法 作者:Jaros?aw Kowalski <> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/conf ...

  9. AngularJS系列-翻译官网

    公司之前一直用的Web前台框架是Knockout,我们通常直接叫ko,有看过汤姆大叔的KO系列,也有在用,发现有时候用得不太顺手.本人是会WPF的,所以MVVM也是比较熟悉的,学ko也是很快就把汤姆大 ...

随机推荐

  1. 【MySQL】unique列插入重复值解决方案

    当在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT.中断操作或者更新旧 ...

  2. Linux 2.6 内核实时性分析 (完善中...)

      经过一个月的学习,目前对linux 下驱动程序的编写有了入门的认识,现在需要着手实践,编写相关的驱动程序. 因为飞控系统对实时性有一定的要求,所以先打算学习linux 2.6 内核的实时性与任务调 ...

  3. Objective-C语法汇总

    1.方法前的加减号 Objective-C中是没有public与private的概念的,即可以认为全部都是public.减号表示的是一个函数.方法.消息的开始.加号则表示不需要创建一个类的实例,其他类 ...

  4. DBA_Oracle AWR Report性能监控报表(案例)

    2014-08-22 Created By BaoXinjian

  5. bug_ _ 常见的bug1

    =====  3   java.lang.reflect.InvocationTargetException 异常解决方法 在做djunit测试的时候,发生下面异常: java.lang.reflec ...

  6. jquery 源码剖析1

    ()();   闭包,让声明的变量变成局部变量,使外部无法访问,防止和其他代码冲突,互不影响. (function(){ })();              和一般执行方法一样的. jQuery=f ...

  7. jsp的一些基本语法

    jsp页面内容 <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  8. C# Bitmap Save Generic GDI+ Error

    Image.Save 方法 (String) 将该 Image 保存到指定的文件或流. 命名空间:  System.Drawing程序集:  System.Drawing(在 System.Drawi ...

  9. JS正则实例

    <html> <body> </body> </html> <script> var strSrc = "xxa1b01c001y ...

  10. SQL字符串分组聚合(分组后的数据查询后用逗号隔开)

    )) , 'aa') , 'bb') , 'aaa') , 'bbb') , 'ccc') go , , '') from tb group by id