【问题标题】:WPF : how to save stroke collection to bitmap?WPF:如何将笔画集合保存到位图?
【发布时间】:2016-12-31 06:21:10
【问题描述】:

我使用 InkCanvas 来实现签名功能。

签名后,我可以使用 RenderTargetBitmap 类将签名图保存到位图中。

但 RenderTargetBitmap 总是保存 InkCanvas 本身,意味着不能只保存签名内容。

我的问题是,如何将 StrokeCollection 保存到位图中?

【问题讨论】:

  • 您有两个选择。循环遍历StrokeCollection 并手动偏移每个单独的笔划,以便将它们绘制在原点角落,或者只是从图像中裁剪空白区域。就个人而言,我推荐后者。

标签: c# wpf inkcanvas


【解决方案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);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多