InkCanvas保存会产生错误的尺寸

问题描述 投票:2回答:2

我使用具有设定宽度和高度的画布。它是500x500大,我也想用这种方法保存它:

    private async void SaveasGIF(object sender, RoutedEventArgs e)
    {
        var savePicker = new Windows.Storage.Pickers.FileSavePicker();
        savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
        savePicker.FileTypeChoices.Add("Gif with embedded ISF", new[] { ".gif" });

        Windows.Storage.StorageFile file = await savePicker.PickSaveFileAsync();
        if (null != file)
        {
            try
            {
                using (Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
                {
                    // Truncate any existing stream in case the new file
                    // is smaller than the old file.
                    stream.Size = 0;

                    await MyInkCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);
                }
                //MainPage.NotifyUser("File has been saved!", NotifyType.StatusMessage);
            }
            catch (Exception ex)
            {
                //MainPage.NotifyUser(ex.Message, NotifyType.ErrorMessage);
            }
        }
        SaveGIF.IsChecked = false;
    }

但是当我这样做时,完成的.gif文件被裁剪并具有类似421x643的尺寸。

我可以改变什么来解决这个问题?

c# visual-studio uwp
2个回答
0
投票

此代码await MyInkCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);用于将一组墨迹笔划保存到文件中。这与将InkCanvas控件的内容呈现为图像并不完全相同。如果笔划超出InkCanvas,则生成的.gif维度将大于原始InkCanvas的维度,反之亦然。

如果您的主要目标是将InkCanvas的内容保存为图像(而不是您计划在以后某个时间加载到InkCanvas中的墨迹笔划),请使用Win2D as described here


0
投票

这是一个众所周知的问题。你可以在Win2D Github issue上看到它。

问题似乎是InkStroke.GetBounds没有考虑贝塞尔曲率,所以它只报告笔画主控制点的边界。

请参考shawnhar的comment及其解决方法。

解决方法是将墨迹笔划转换为Win2D几何(使用CanvasGeometry.CreateInk),然后使用Win2D几何API查询其边界。这对于所有钢笔墨水笔划都是准确的,但如果使用铅笔墨水样式则不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.