WPF: как сохранить коллекцию штрихов в растровое изображение?

Я использую InkCanvas для реализации функции подписи.

после подписания я могу использовать класс RenderTargetBitmap, чтобы сохранить рисунок подписи в растровое изображение.

но RenderTargetBitmap всегда сохраняет сам InkCanvas, то есть не может сохранять ТОЛЬКО содержимое подписи.

мой вопрос, как сохранить StrokeCollection в растровое изображение?


person Oh My Dog    schedule 31.12.2016    source источник
comment
У вас есть два варианта. Либо выполните цикл по StrokeCollection и вручную сместите каждый отдельный штрих, чтобы они были нарисованы в исходном углу, либо просто обрежьте пустое пространство на вашем изображении. Лично я бы рекомендовал последнее.   -  person Abion47    schedule 31.12.2016


Ответы (1)


Я думаю, вам следует использовать Win2D (пакет Win2D.uwp NuGet); это довольно легко. Вот код:

        async void SaveAsBitmap(object sender, RoutedEventArgs e)
    {
        //copy from origianl canvas and paste on the new canvas for saving
        var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
        //check if canvas is not empty
        if (strokes.Count == 0) return;

        //select all the strokes to be copied to the clipboard
        foreach (var stroke in strokes)
        {
            stroke.Selected = true;
        }
        inkCanvas.InkPresenter.StrokeContainer.CopySelectedToClipboard();

        //paste the strokes to a new InkCanvas and move the strokes to the topper left corner 
        var newCanvas = new InkCanvas();
        newCanvas.InkPresenter.StrokeContainer.PasteFromClipboard(new Point(0, 0));

        //using Win2D to save ink as png
        CanvasDevice device = CanvasDevice.GetSharedDevice();
        CanvasRenderTarget renderTarget = new CanvasRenderTarget(device,
            (int)inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Width,
            (int)inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Height,
            96);

        using (var ds = renderTarget.CreateDrawingSession())
        {
            //ds.Clear(Colors.White); //uncomment this line for a white background
            ds.DrawInk(newCanvas.InkPresenter.StrokeContainer.GetStrokes());
        }

        //save file dialog
        var savePicker = new Windows.Storage.Pickers.FileSavePicker()
        {
            SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary
        };
        savePicker.FileTypeChoices.Add("Image file", new List<string>() { ".jpeg", ".png" });
        savePicker.SuggestedFileName = "mysign.png";
        var file = await savePicker.PickSaveFileAsync();

        if (file != null)
        {
            using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png);
            }
        }
    }
person Roger    schedule 09.01.2017