SkiaSharp 是一个强大的 2D 图形引擎,可以用来绘制各种图形,包括贝塞尔曲线。本文将详细介绍如何在 WinForm 应用程序中使用 SkiaSharp 绘制二次贝塞尔曲线和三次贝塞尔曲线。
首先需要通过 NuGet 包管理器安装以下包:
C#using SkiaSharp;
using SkiaSharp.Views.Desktop;
namespace AppBezier
{
public partial class Form1 : Form
{
private SKGLControl skControl;
public Form1()
{
InitializeComponent();
InitializeSkiaSharp();
}
private void InitializeSkiaSharp()
{
// 创建 SKGLControl 控件
skControl = new SKGLControl();
skControl.Dock = DockStyle.Fill;
skControl.PaintSurface += SkControl_PaintSurface;
this.Controls.Add(skControl);
}
private void SkControl_PaintSurface(object sender, SKPaintGLSurfaceEventArgs e)
{
// 获取画布
SKCanvas canvas = e.Surface.Canvas;
// 清空画布
canvas.Clear(SKColors.White);
// 创建画笔
using (var paint = new SKPaint
{
Style = SKPaintStyle.Stroke,
Color = SKColors.Blue,
StrokeWidth = 2,
IsAntialias = true
})
{
// 绘制二次贝塞尔曲线
DrawQuadraticBezier(canvas, paint);
// 修改画笔颜色
paint.Color = SKColors.Red;
// 绘制三次贝塞尔曲线
DrawCubicBezier(canvas, paint);
// 绘制控制点和辅助线
DrawControlPoints(canvas);
}
}
private void DrawQuadraticBezier(SKCanvas canvas, SKPaint paint)
{
// 定义二次贝塞尔曲线的点
var path = new SKPath();
// 起点
float startX = 50;
float startY = 200;
// 控制点
float controlX = 150;
float controlY = 50;
// 终点
float endX = 250;
float endY = 200;
// 移动到起点
path.MoveTo(startX, startY);
// 绘制二次贝塞尔曲线
path.QuadTo(controlX, controlY, endX, endY);
// 绘制路径
canvas.DrawPath(path, paint);
}
private void DrawCubicBezier(SKCanvas canvas, SKPaint paint)
{
// 定义三次贝塞尔曲线的点
var path = new SKPath();
// 起点
float startX = 300;
float startY = 200;
// 第一个控制点
float control1X = 400;
float control1Y = 50;
// 第二个控制点
float control2X = 500;
float control2Y = 350;
// 终点
float endX = 600;
float endY = 200;
// 移动到起点
path.MoveTo(startX, startY);
// 绘制三次贝塞尔曲线
path.CubicTo(control1X, control1Y, control2X, control2Y, endX, endY);
// 绘制路径
canvas.DrawPath(path, paint);
}
private void DrawControlPoints(SKCanvas canvas)
{
// 创建控制点画笔
using (var pointPaint = new SKPaint
{
Style = SKPaintStyle.Fill,
Color = SKColors.Green,
IsAntialias = true
})
using (var linePaint = new SKPaint
{
Style = SKPaintStyle.Stroke,
Color = SKColors.Gray,
StrokeWidth = 1,
PathEffect = SKPathEffect.CreateDash(new float[] { 5, 5 }, 0),
IsAntialias=true
})
{
// 二次贝塞尔曲线的控制点
canvas.DrawCircle(50, 200, 4, pointPaint); // 起点
canvas.DrawCircle(150, 50, 4, pointPaint); // 控制点
canvas.DrawCircle(250, 200, 4, pointPaint); // 终点
// 绘制辅助线
canvas.DrawLine(50, 200, 150, 50, linePaint);
canvas.DrawLine(150, 50, 250, 200, linePaint);
// 三次贝塞尔曲线的控制点
canvas.DrawCircle(300, 200, 4, pointPaint); // 起点
canvas.DrawCircle(400, 50, 4, pointPaint); // 控制点1
canvas.DrawCircle(500, 350, 4, pointPaint); // 控制点2
canvas.DrawCircle(600, 200, 4, pointPaint); // 终点
// 绘制辅助线
canvas.DrawLine(300, 200, 400, 50, linePaint);
canvas.DrawLine(400, 50, 500, 350, linePaint);
canvas.DrawLine(500, 350, 600, 200, linePaint);
}
}
}
}

首先,我们创建了一个 SKGLControl 控件并将其添加到窗体中。这个控件将作为我们的绘图表面。
在 SkControl_PaintSurface 事件处理程序中,我们执行实际的绘图操作:
二次贝塞尔曲线使用三个点来定义:
使用 QuadTo 方法来绘制二次贝塞尔曲线。
三次贝塞尔曲线使用四个点来定义:
使用 CubicTo 方法来绘制三次贝塞尔曲线。
为了更好地理解贝塞尔曲线的形成,我们还绘制了:
SkiaSharp 提供了强大而灵活的贝塞尔曲线绘制功能。通过调整控制点,我们可以创建各种平滑的曲线效果。这个示例展示了基本的实现方法,你可以基于此进行更复杂的图形绘制。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!