Рендеринг любых изображений и контролов 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);
}
});