缩放画布InkStrokes

时间:2018-05-03 20:46:57

标签: c# canvas uwp inkcanvas

我正在用相机拍照,用它作为InkCanvas的背景,并让用户画出超越。

当用户保存他们的绘图时,我正在缩放绘图以匹配背景中图像的大小。我无法调整原始图像的大小。

然而,虽然缩放笔划的长度和位置,但宽度不是。 滚动浏览StackOverflow我发现有人说你还需要在InkStroke.DrawingAttributes.PenTipTransformInkStroke.PointTransform上设置比例,但是当我尝试将值设置为比例时,值不会变化

原创价值观 Origional 新价值观 New Values

我将非常感谢您提供有关如何设置此值或其他相同方法的任何信息。

由于

UI代码

 <!-- Canvas -->
    <Image Grid.Row="1" x:Name="imgImage" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" SizeChanged="imgImage_SizeChanged"/>

    <InkCanvas Grid.Row="1" x:Name="inkCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" PointerExited="inkCanvas_PointerExited" Visibility="Collapsed">
        <InkCanvas.RenderTransform>
            <ScaleTransform x:Name="inkCanvasScaleTransform" />
        </InkCanvas.RenderTransform>
    </InkCanvas>

编辑 - 更多信息

相机拍摄的图像分辨率为3264x244,然后用户可以使用画布在图像上绘图,但我无法在屏幕上显示整个图像,因此缩小尺寸以适应尺寸帆布。画布(在这种特殊情况下)的分辨率为1012x759。

保存图像时,绘图的位置会按比例放大以匹配图像的完整大小。但是笔画的宽度没有。

P.S。目前尚未使用XAML中的缩放变换。

保存代码

StorageFile inputFile = null;
        inputFile = await StorageFile.GetFileFromPathAsync(_image.fullPath);
        height = (int)inkCanvas.ActualHeight;
        width = (int)inkCanvas.ActualWidth;
        double scalex = 0;
        double scaley = 0;
        double offsety = 0;
        double offsetx = 0;
        double widthscale = 1;
        if (inputFile != null)
        {
            var prop = await inputFile.Properties.GetImagePropertiesAsync();
            offsetx = (double)prop.Width - width;
            offsety = (double)prop.Height - height;
            scalex = ((double)prop.Width - width) / width;
            scaley = ((double)prop.Height - height) / height;
            width = (int)prop.Width;
            height = (int)prop.Height;
            widthscale = 1 + ((scalex * scaley) / 2);
        }

        var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
        List<InkStroke> ExpandedStrokes = new List<InkStroke>();
        foreach (var stroke in strokes)
        {
            InkStroke strk = stroke.Clone();
            Matrix3x2 scaleMatrix = Matrix3x2.CreateScale(1 + (float)scalex, 1 + (float)scaley);
            strk.PointTransform = scaleMatrix;
            strk.DrawingAttributes.PenTipTransform = scaleMatrix;
            ExpandedStrokes.Add(strk);
        }

        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        CanvasDevice device = CanvasDevice.GetSharedDevice();
        CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, width, height, 96);
        using (var ds = renderTarget.CreateDrawingSession())
        {
            ds.Clear(Colors.White);
            if (inputFile != null)
            {
                using (CanvasBitmap image = await CanvasBitmap.LoadAsync(device, inputFile.Path, 96))
                {
                    ds.DrawImage(image);
                }
            }
            ds.DrawInk(ExpandedStrokes);
        }
        using (var fileStream = await inputFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
        }

PenTip的比例可能不正确,但只是试图让它做出改变。

示例图片

缩放前(1012x759) Before Scaling

缩放后(3264x2448) After Scaling

1 个答案:

答案 0 :(得分:0)

InkStroke.PointTransform用于调整笔画长度,不会缩放笔画的粗细。如果要显示具有相应宽度的笔划,可以使用InkCanvas.RenderTransform并设置它的ScaleX和ScaleY,但它不会影响笔划厚度的实际效果,它只是调整InkCanvas的大小以使Strokes看起来像是缩放的。似乎没有任何属性可以改变在图像上绘制的笔划的实际厚度。

实际上,当您拍摄照片并将其作为背景图像放在Image控件中时,用户可以在图像上绘图,您可以让用户选择具有不同配置的笔画。用户完成绘图后,会用笔画保存图像,这应该是他们想要的效果。也就是说,我们用笔画一个小图像,我们应该确保笔画在正确的位置,如果图像变大,笔画应该自动改变,我不认为我们应该改变中风量表再次。