C# 缩放画布墨迹

C# 缩放画布墨迹,c#,canvas,uwp,inkcanvas,C#,Canvas,Uwp,Inkcanvas,我用相机拍了一张照片,用它作为InkCanvas的背景,让用户在上面画 当用户保存其图形时,我将缩放图形以匹配背景中图像的大小。我无法调整原始图像的大小 但是,当笔划的长度和位置被缩放时,宽度不会被缩放。 在StackOverflow中滚动时,我发现有人说您还需要在InkStroke.DrawingAttributes.PenTipTransform以及InkStroke.PointTransform上设置比例,但当我尝试将该值设置为比例时,该值不会改变 原始值 新价值观 如果您能告诉我如何设

我用相机拍了一张照片,用它作为InkCanvas的背景,让用户在上面画

当用户保存其图形时,我将缩放图形以匹配背景中图像的大小。我无法调整原始图像的大小

但是,当笔划的长度和位置被缩放时,宽度不会被缩放。 在StackOverflow中滚动时,我发现有人说您还需要在
InkStroke.DrawingAttributes.PenTipTransform
以及
InkStroke.PointTransform
上设置比例,但当我尝试将该值设置为比例时,该值不会改变

原始值 新价值观

如果您能告诉我如何设置此值,或者以其他方式设置相同的值,我们将不胜感激

谢谢

用户界面代码

 <!-- 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

保存图像时,绘图的位置将按比例放大,以匹配图像的完整大小。但笔划的宽度并不相同

另外,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);
        }
StorageFile inputFile=null;
inputFile=await-StorageFile.GetFileFromPathAsync(_-image.fullPath);
高度=(int)inkCanvas.ActualHeight;
宽度=(int)inkCanvas.ActualWidth;
双标度=0;
双刻度=0;
双偏置=0;
双偏移量x=0;
双宽度刻度=1;
if(inputFile!=null)
{
var prop=await inputFile.Properties.GetImagePropertiesAsync();
偏移量x=(双)道具宽度-宽度;
偏移量=(双)道具高度-高度;
scalex=((双)道具宽度-宽度)/宽度;
scaley=((双)道具高度-高度)/高度;
宽度=(int)prop.width;
高度=(int)道具高度;
宽度比例=1+((比例x比例)/2);
}
var strokes=inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
List ExpandedStrokes=新列表();
foreach(笔划中的变量笔划)
{
InkStroke strk=stroke.Clone();
Matrix3x2 scaleMatrix=Matrix3x2.CreateScale(1+(浮点)scalex,1+(浮点)scaley);
strk.PointTransform=scaleMatrix;
strk.DrawingAttributes.pentipttransform=scaleMatrix;
ExpandedStrokes.Add(strk);
}
StorageFolder StorageFolder=ApplicationData.Current.LocalFolder;
CanvasDevice=CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget=新的CanvasRenderTarget(设备、宽度、高度,96);
使用(var ds=renderTarget.CreateDrawingSession())
{
ds.清晰(颜色:白色);
if(inputFile!=null)
{
使用(CanvasBitmap image=wait CanvasBitmap.LoadAsync(设备,inputFile.Path,96))
{
ds.DrawImage(图像);
}
}
ds.DrawInk(展开笔划);
}
使用(var fileStream=await inputFile.OpenAsync(FileAccessMode.ReadWrite))
{
等待renderTarget.SaveAsync(fileStream,CanvasBitmapFileFormat.Jpeg,1f);
}
奔腾的规模可能不正确,但只是想让它有所改变

示例图像

缩放前(1012x759)

缩放后(3264x2448)

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


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

你能提供更多的代码并澄清你想要达到的真实效果吗?如果用户在图像上绘制笔划,他们会希望在那里绘制笔划,为什么要再次缩放?那么,缩放图形以匹配图像大小的意思是什么?如果你能提供最低限度的样品来帮助我了解你的问题,那就更好了。