我正在用相机拍照,用它作为InkCanvas的背景,并让用户画出超越。
当用户保存他们的绘图时,我正在缩放绘图以匹配背景中图像的大小。我无法调整原始图像的大小。
然而,虽然缩放笔划的长度和位置,但宽度不是。
滚动浏览StackOverflow我发现有人说你还需要在InkStroke.DrawingAttributes.PenTipTransform
和InkStroke.PointTransform
上设置比例,但是当我尝试将值设置为比例时,值不会变化
我将非常感谢您提供有关如何设置此值或其他相同方法的任何信息。
由于
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的比例可能不正确,但只是试图让它做出改变。
示例图片
答案 0 :(得分:0)
InkStroke.PointTransform用于调整笔画长度,不会缩放笔画的粗细。如果要显示具有相应宽度的笔划,可以使用InkCanvas.RenderTransform
并设置它的ScaleX和ScaleY,但它不会影响笔划厚度的实际效果,它只是调整InkCanvas的大小以使Strokes看起来像是缩放的。似乎没有任何属性可以改变在图像上绘制的笔划的实际厚度。
实际上,当您拍摄照片并将其作为背景图像放在Image
控件中时,用户可以在图像上绘图,您可以让用户选择具有不同配置的笔画。用户完成绘图后,会用笔画保存图像,这应该是他们想要的效果。也就是说,我们用笔画一个小图像,我们应该确保笔画在正确的位置,如果图像变大,笔画应该自动改变,我不认为我们应该改变中风量表再次。