应用有时需要将图形绘制到目标,其中该目标不适合立即显示。 这种绘图有时称为“屏幕外呈现”或“绘制到纹理”。 例如,当将绘图操作的应用输出保存到文件、作为像素数组返回或用作后续操作的输入时,这非常有用。
Win2D 支持这些方案,并且可以轻松实现 CanvasRenderTarget。
CanvasRenderTargetCanvasBitmap扩展并具有方法CreateDrawingSession()。 用于CreateDrawingSession将图形内容绘制到 .CanvasRenderTarget 例如:
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget offscreen = new CanvasRenderTarget(device, width, height, 96);
using (CanvasDrawingSession ds = offscreen.CreateDrawingSession())
{
ds.Clear(Colors.Black);
ds.DrawRectangle(100, 200, 5, 6, Colors.Red);
}
请注意,有一个方法调用。Clear 如果没有,位图将使用未定义的内容进行初始化。 根据行为,通过 CanvasRenderTarget 创建的绘图会话不同于在 Win2D 的 XAML 控件 Clear 上创建的会话。 创建绘图会话时,Win2D 始终会自动清除控件。 CanvasRenderTargets 不是。 这样,应用就能够对 -s 进行增量更改 CanvasRenderTarget,并避免每次重新绘制整个场景。
若要绘制到另一个 CanvasRenderTarget 绘图会话,只需使用 DrawImage(ICanvasImage) 或其重载之一。 例如:
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawImage(offscreen, 23, 34);
}
或者,若要使用 CanvasRenderTarget 作为效果的输入,请传入效果预期用作 IGraphicsEffectSource 源的位置。 例如:
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Source = offscreen,
BlurAmount = 3.0f
};
应用可以多次关闭并重新打开绘图会话 CanvasRenderTarget 。
在释放绘图会话对象之前,绘图操作不会提交到 CanvasRenderTarget 绘图操作。 在 C# 中,块 using 可以组织此代码。
值得指出的是,这不是 CanvasRenderTarget XAML 控件,根本不涉及 XAML 树。 它适用于 XAML 和非基于 XAML 的应用。