在无头应用程序中创建图像 [英] Creating an image in a headless application
问题描述
我有一个作为无头应用程序运行的Web服务器。该服务器应将图表作为图像(即png)进行响应。我的想法是,在Canvas上绘制并将其渲染为png图像。但是我无法创建Canvas。我收到错误,它在
中调用错误的线程。我从普通的UWP应用程序中了解这些问题,我可以使用调度程序切换到UI线程。但是在Iot无头应用程序中没有UI线程。
I have a web server running as a headless application. That server shall respond a chart as an image (i.e. png). My idea was, to draw on a Canvas and render this to a png image. But I'm not able to create a Canvas. I'm getting the error, it is called in the wrong thread. I know these problems from normal UWP apps, where I can use the dispatcher to switch to UI thread. But in Iot headless applications there is no UI thread.
有人有想法,我如何渲染图表以将其保存为文件中的图像?
Does someone have an idea, how I can render a chart to save that as an image on a file?
推荐答案
你好Wernfried,
Hello Wernfried,
你可以实现
XamlRenderingBackgroundTask 。
You can implement XamlRenderingBackgroundTask.
以下是您可以参考的示例:
Here is a sample you can reference:
public sealed class StartupTask : XamlRenderingBackgroundTask
{
protected async override void OnRun(IBackgroundTaskInstance taskInstance)
{
var def = taskInstance.GetDeferral();
// creating control
var canvas = new Canvas
{
Height = 100,
Width = 100
};
canvas.Children.Add(new TextBlock { Text = "Hello world" });
var size = new Size(100, 100);
canvas.Measure(size);
canvas.UpdateLayout();
canvas.Arrange(new Rect(0, 0, size.Width, size.Height));
// rendering
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(canvas);
// saving as png
var file = await KnownFolders.PicturesLibrary.CreateFileAsync("sample.png");
using (var stream = await file.OpenStreamForWriteAsync())
{
var pixelBuffer = await bitmap.GetPixelsAsync();
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
// convert stream to IRandomAccessStream
var randomAccessStream = stream.AsRandomAccessStream();
// encoding & finish saving
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, randomAccessStream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth,
(uint)bitmap.PixelHeight, logicalDpi, logicalDpi, pixelBuffer.ToArray());
await encoder.FlushAsync();
}
def.Complete();
}
}
祝你好运,
Rita
这篇关于在无头应用程序中创建图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!