在SkiaSharp中绘制旋转文本

6

如何在SkiaSharp中绘制旋转文本。

目前我是通过旋转SKCanvas,绘制文本,然后再将其旋转回来。但我想可能有更有效的方法来实现这一点。

canvas.RotateDegrees(45, 20, 20);
canvas.DrawText("Text", 20, 20, paint);
canvas.RotateDegrees(-45, 20, 20);
2个回答

9

这是正确的方式(我认为也是唯一的方式)。

实际上并不会像旋转画布那样效率低下,而是通过调整绘图矩阵(一个int[9]数组)来实现。在底层,它会执行类似于以下操作:

var m = SKMatrix.CreateRotation(45); // simple struct over int[9]
canvas.CurrentMatrix.Concat(m)       // simple multiplication

然后在你绘图时,它只是使用矩阵:
canvas.DrawText(text, matrix);

当你旋转回来时,它只是重新计算了数学运算。

另一种方法是保存画布,然后恢复:

canvas.Save();
canvas.Rotate(45);
canvas.DrawText(text);
canvas.Restore();

这只是在保存期间复制当前矩阵。当您恢复时,它只是还原它。在这种方法中,您可以进行一系列的转换,而无需反向操作,因此这是一种“更好”的方式。

或者,您可以使用方便的类型:

// auto save
using (new SKAutoCanvasRestore(canvas)) {
    // do any transformations
    canvas.Rotate(45);
    // do serious work
    canvas.DrawText(text);
    // auto restore, even on exceptions or errors
}

还有一种完全不同的绘制文本的方法,就是沿着路径绘制:

var path = new SKPath();
// create path ...

// draw using path
canvas.DrawText("text", path, hOffset: 0, vOffset: 0, paint);

谢谢Matthew,这太棒了。我对Skia非常兴奋。它看起来非常有前途和强大。 - Vahid
使用canvas的save、rotate、drawtext和restore比使用skpath的drawtext更有效率吗? - Iain Stanford

5

在 SkiaSharp 中,您可以沿着路径绘制文本,因此(例如)可以将文本对角线地绘制在图像上:

using (SKPaint skPaint = new SKPaint())
{
  SKPath path = new SKPath();
  path.MoveTo(original.Width / 10, original.Height - original.Height / 10);
  path.LineTo(original.Width - original.Width / 10, original.Height / 10);

  canvas.DrawTextOnPath(textToWrite, path, 0, 0, skPaint);
  path.Dispose();
}

使用MeasureText获取文本长度,并使用此长度将其置于中心,要么通过计算对角线路径的长度并在DrawTextOnPath参数中设置起始点值,要么设置路径原点不为0,0(正如我在示例中所做的那样)。
我不确定这是否比旋转画布更高效,但它似乎是绘图的一种更明显的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接