Universal Windows InkCanvas strokes disappear on RenderTargetBitmap.RenderAsync

后端 未结 2 980
夕颜
夕颜 2021-01-14 07:01

I try to render the strokes of a InkCanvas to a RenderTargetBitmap in a windows 10 universal App. Here is my xaml code:



        
相关标签:
2条回答
  • 2021-01-14 07:37

    In the XAML visuals and RenderTargetBitmap section in the RenderTargetBitmap documentation, it describes: Content that can't be captured will appear as blank in the captured image, but other content in the same visual tree can still be captured and will render (the presence of content that can't be captured won't invalidate the entire capture of that XAML composition).So it could be that the content of InkCanvas is not captureable.

    An alternative is to use Win2D (Direct2D .NET wrapper from Microsoft). Win2D can be used in an UWP app via a nuget package. You will be able to manage the ink strokes and save them to image (jpeg, png, and other formats).

    0 讨论(0)
  • 2021-01-14 07:39

    You can use Win2D to render the Ink Strokes.

    1. Add Win2D.uwp to the project from NuGet
    2. Add this InkCanvasExtensions.cs file to your project
    3. Change the namespace or add using Zoetrope; to your source
    4. Create an image file or stream and pass it to the InkCanvas.RenderAsync()

    InkCanvasExtensions.cs

    namespace Zoetrope
    {
        using System;
        using System.Threading.Tasks;
        using Microsoft.Graphics.Canvas;
        using Windows.Graphics.Display;
        using Windows.Storage.Streams;
        using Windows.UI;
        using Windows.UI.Xaml.Controls;
    
        /// <summary>
        /// InkCanvas Extensions
        /// </summary>
        public static class InkCanvasExtensions
        {
            /// <summary>
            /// Render an InkCanvas to a stream
            /// </summary>
            /// <param name="inkCanvas">the ink canvas</param>
            /// <param name="fileStream">the file stream</param>
            /// <param name="backgroundColor">the background color</param>
            /// <param name="fileFormat">the file format</param>
            /// <returns>an async task</returns>
            public static async Task RenderAsync(
                this InkCanvas inkCanvas, 
                IRandomAccessStream fileStream, 
                Color backgroundColor,
                CanvasBitmapFileFormat fileFormat)
            {
                // do not put in using{} structure - it will close the shared device.
                var device = CanvasDevice.GetSharedDevice();
                var width = (float) inkCanvas.ActualWidth;
                var height = (float) inkCanvas.ActualHeight;
                var currentDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
    
                using (var offscreen = new CanvasRenderTarget(device, width, height, currentDpi))
                {
                    using (var session = offscreen.CreateDrawingSession())
                    {
                        session.Clear(backgroundColor);
    
                        session.DrawInk(inkCanvas.InkPresenter.StrokeContainer.GetStrokes());
                    }
    
                    await offscreen.SaveAsync(fileStream, fileFormat);
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题