Рисование вне экрана

Приложениям иногда требуется рисование графики в целевом объекте, где целевой объект не предназначен для немедленного отображения. Этот тип рисования иногда называется "внеэкранной отрисовкой" или "рисованием в текстуру". Это полезно, если, например, выходные данные приложения операции рисования должны быть сохранены в файле, возвращены в виде массива пикселей или используются в качестве входных данных для последующей операции.

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 элементов управления XAML Win2D, отличаются от тех, которые создаются в элементах управления XAML Win2D с точки зрения Clear поведения. Элементы управления всегда очищаются автоматически с помощью Win2D при создании сеанса рисования. CanvasRenderTargets нет. Таким образом, у приложений есть возможность вносить добавочные изменения в CanvasRenderTarget-s, и не перерисовывать всю сцену каждый раз.

Чтобы нарисовать 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.