在UWP中缩放InkStrokes

我有一个简单的演示应用程序,它使用一个图像作为InkCanvas的背景,并在调整图像的显示大小时缩放笔划,使它们保持在相对于图像的相同位置。 既然你可以绘制 – >resize – >绘制 – >resize – >绘制这意味着我必须通过在每个笔划上指定PointTransform来每次缩放每个笔划不同的量。

float thisScale = (float)(scale / _prevScale); foreach (InkStroke stroke in myCanvas.InkPresenter.StrokeContainer.GetStrokes()) { float thisPointScale = thisScale * stroke.PointTransform.M11; stroke.PointTransform = Matrix3x2.CreateScale(new Vector2(thisPointScale)); } 

这样可以很好地调整笔划的长度。 但是,它对笔画的厚度没有任何影响。 当您使用厚笔或非均匀笔(例如荧光笔)时,这一点更加明显。

这些链接到两个显示结果的屏幕剪辑。 全屏 – https://1drv.ms/i/s!ArHMZAt1svlBiZZDfrxFqyGU1bJ6MQ较小的窗口 – https://1drv.ms/i/s!ArHMZAt1svlBiZZCqHHYaISPfWMMpQ

关于如何调整笔画粗细的任何想法?

将ScaleTransform应用于InkCanvas控件。 这将负责缩放墨水笔划,笔划位置和背景图像。 本质上,转换适用于InkCanvas中包含的所有内容。 无需将Matrix与StrokeCollection一起使用。

XAML

                     

  private void ScaleUpButton_Click(object sender, RoutedEventArgs e) { InkCanvasScaleTransform.ScaleX += .2; InkCanvasScaleTransform.ScaleY += .2; } private void ScaleDownButton_Click(object sender, RoutedEventArgs e) { InkCanvasScaleTransform.ScaleX -= .2; InkCanvasScaleTransform.ScaleY -= .2; } private void InkRedAttributesButton_Click(object sender, RoutedEventArgs e) { DrawingAttributes inkAttributes = new DrawingAttributes(); inkAttributes.Height = 12; inkAttributes.Width = 12; inkAttributes.Color = Colors.Red; inkAttributes.IsHighlighter = true; myCanvas.DefaultDrawingAttributes = inkAttributes; } private void InkBlueAttributesButton_Click(object sender, RoutedEventArgs e) { DrawingAttributes inkAttributes = new DrawingAttributes(); inkAttributes.Height = 12; inkAttributes.Width = 12; inkAttributes.Color = Colors.Blue; inkAttributes.IsHighlighter = true; myCanvas.DefaultDrawingAttributes = inkAttributes; } 

截图

缩放100% 缩放100%

比例为60% 比例为60%

缩放InkCanvas并不总能解决问题,尤其是当您想要将缩放的墨迹保存到gif图像文件中时。

显然,InkStroke的PointTransform仅转换笔划点的位置,而不是用于绘制笔划的PenTip的大小。 (没有记录在我能找到的任何地方,但通过反复试验发现。名称’PointTransform’有点头脑)

因此,除了将缩放因子应用于PointTransform之外,还必须按如下方式缩放PenTip(修改原始代码):

 float thisPointScale = thisScale * stroke.PointTransform.M11; stroke.PointTransform = Matrix3x2.CreateScale(new Vector2(thisPointScale)); stroke.DrawingAttributes.PenTipTransform = Matrix3x2.CreateScale(new Vector2(thisPointScale)); 

希望这有助于某人……

要调整笔划的粗细,您必须更改DrawingAttributes的Size属性。 PenTipTransform不适用于铅笔 – 它会引发exception。

关键是你不能直接设置笔画的DrawingAttributes属性: https : //docs.microsoft.com/en-us/uwp/api/windows.ui.input.inking.inkdrawingattributes

以下是如何获得此示例的示例:

  static IEnumerable GetScaledStrokes(IEnumerable source, float scale) { var scaleMatrix = Matrix3x2.CreateScale(scale); var resultStrokes = source.Select(x => x.Clone()).ToArray(); foreach (var inkStroke in resultStrokes) { inkStroke.PointTransform = scaleMatrix; var da = inkStroke.DrawingAttributes; var daSize = da.Size; daSize.Width = daSize.Width * scale; daSize.Height = daSize.Height * scale; da.Size = daSize; inkStroke.DrawingAttributes = da; } return resultStrokes; } 

完整示例: https : //github.com/ycherkes/ScaledInks