在SkiaSharp中绘制旋转文本

时间:2017-01-28 10:02:04

标签: wpf skia skiasharp

如何在SkiaSharp中绘制旋转的文字。

目前我正在旋转SKCanvas,绘制文字然后再将其旋转。但我想可能有更有效的方法来做到这一点。

   canvas.RotateDegrees(45, 20, 20);
   canvas.DrawText("Text", 20, 20, paint);
   canvas.RotateDegrees(-45, 20, 20);

2 个答案:

答案 0 :(得分:7)

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

由于您没有真正旋转画布,而是调整绘图矩阵(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);

答案 1 :(得分:2)

您可以在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以外的路径原点来使用它来使其适合中心:就像我在例子中所做的那样)

我不确定它是否比旋转画布更有效,但它似乎更加明显'做画的方式。