在 SkiaSharp 中绘制旋转文本
Draw rotated text in SkiaSharp
如何在 SkiaSharp
中绘制旋转文本。
目前我正在旋转 SKCanvas
,绘制文本然后将其旋转回来。但我认为可能有更有效的方法来做到这一点。
canvas.RotateDegrees(45, 20, 20);
canvas.DrawText("Text", 20, 20, paint);
canvas.RotateDegrees(-45, 20, 20);
这是正确的方法(我认为是唯一的方法)。
它并没有那么低效,因为您并不是真正旋转 canvas,而是调整绘图矩阵(int[9]
数组)。在引擎盖下它正在做这样的事情:
var m = SKMatrix.CreateRotation(45); // simple struct over int[9]
canvas.CurrentMatrix.Concat(m) // simple multiplication
然后当你绘制时,它只使用矩阵:
canvas.DrawText(text, matrix);
当您向后旋转时,它会再次计算。
另一种方法是保存 canvas 然后恢复:
canvas.Save();
canvas.Rotate(45);
canvas.DrawText(text);
canvas.Restore();
这只是在保存期间复制当前矩阵。当你恢复时,它只是恢复它。这是一种 "better" 方式,因为您可以进行一系列转换,而无需反转。
或者,您可以使用方便的类型:
// 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);
您可以在 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(就像我在示例中所做的那样)
虽然我不确定它是否比旋转 canvas 更有效,但它似乎是一种更 'obvious' 的绘图方式。
如何在 SkiaSharp
中绘制旋转文本。
目前我正在旋转 SKCanvas
,绘制文本然后将其旋转回来。但我认为可能有更有效的方法来做到这一点。
canvas.RotateDegrees(45, 20, 20);
canvas.DrawText("Text", 20, 20, paint);
canvas.RotateDegrees(-45, 20, 20);
这是正确的方法(我认为是唯一的方法)。
它并没有那么低效,因为您并不是真正旋转 canvas,而是调整绘图矩阵(int[9]
数组)。在引擎盖下它正在做这样的事情:
var m = SKMatrix.CreateRotation(45); // simple struct over int[9]
canvas.CurrentMatrix.Concat(m) // simple multiplication
然后当你绘制时,它只使用矩阵:
canvas.DrawText(text, matrix);
当您向后旋转时,它会再次计算。
另一种方法是保存 canvas 然后恢复:
canvas.Save();
canvas.Rotate(45);
canvas.DrawText(text);
canvas.Restore();
这只是在保存期间复制当前矩阵。当你恢复时,它只是恢复它。这是一种 "better" 方式,因为您可以进行一系列转换,而无需反转。
或者,您可以使用方便的类型:
// 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);
您可以在 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(就像我在示例中所做的那样)
虽然我不确定它是否比旋转 canvas 更有效,但它似乎是一种更 'obvious' 的绘图方式。