在无头应用程序中创建图像 [英] Creating an image in a headless application

查看:59
本文介绍了在无头应用程序中创建图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个作为无头应用程序运行的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆