Перейти к содержанию

Рендеринг любых изображений и контролов WPF на сервере

Рендеринг любых изображений и контролов WPF на сервере

Иногда может возникнуть необходимость выполнить рендеринг некоторого контрола в файл изображения. Изображение может понадобиться сформировать не только на клиенте, но и на сервере. Начиная со сборки 2.2 в Tessa были добавлены вспомогательные методы, которые упрощают процесс такого рендеринга.

В файле проекта приложения (или в библиотеке с расширениями) должны быть указаны как минимум следующие ссылки на сборки:

  • PresentationCore

  • PresentationFramework

  • System

  • System.Core

  • System.Xaml

  • System.Xml

  • Tessa (версия 2.2 или старше)

  • Tessa.UI (версия 2.2 или старше)

  • WindowsBase

Для того, чтобы выполнить рендеринг некоторого контрола WpfControl (наследник UIElement, такой как UserControl), причём размер результирующего изображения определить автоматически (по минимальному размеру, который предпочтителен для такого контрола) и сохранить результат в файл изображения в формате PNG, используйте следующий код:

using Tessa.UI; ...

UIHelper.InvokeStaAction(() => { BitmapFrame frame = UIHelper.Render(new WpfControl());

var encoder = new PngBitmapEncoder(); encoder.Frames.Add(frame);

using (Stream stream = File.Create(@"C:\Tessa\test.png")) { encoder.Save(stream); } });

Рендеринг будет выполняться средствами CPU (т.е. Software Rendering), поэтому его можно выполнить даже на сервере, на котором может не быть GPU. Метод можно вызывать из любого потока, в т.ч. одновременно из нескольких потоков.

Если же необходимо выполнить рендеринг контрола WpfControl в изображение заданных размеров size, то используйте следующий код:

UIHelper.InvokeStaAction(() => { Size size = new Size(128.0, 128.0); BitmapFrame frame = UIHelper.Render(new WpfControl(), size);

var encoder = new PngBitmapEncoder(); encoder.Frames.Add(frame);

using (Stream stream = File.Create(@"C:\Tessa\test.png")) { encoder.Save(stream); } });

Back to top