wpf - 在 SkiaSharp 中绘制旋转文本

标签 wpf skia 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();

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

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

// 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);

关于wpf - 在 SkiaSharp 中绘制旋转文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908497/

相关文章:

.net - 作为 wpf 应用程序实现的 winforms 应用程序示例?

xamarin - 如何消除使用 SkiaSharp 创建的 ImageSource 中的伪影

wpf - SkiaSharp 可以在 WPF 应用程序中使用吗?

c# - ListView 'SelectionChanged' 事件后聚焦于 TextBox

WPF:工具栏是一个键盘陷阱

c# - 如何仅获取xaml列表中的第一项

Android SKIA 图像解码

android - 返回 ~SkSpriteBlitter() 时我遇到了skia native 崩溃

c# - WPF 中使用 SkiaSharp 实现模糊文本

skiasharp - PDF 页面上的多个剪切区域不起作用