1. 为什么选择SkiaSharp?从GDI+到现代图形库的跨越
如果你之前用C#在WinForm里画过图,大概率接触过GDI+。那个Graphics对象,还有DrawEllipse、DrawRectangle这些方法,用起来确实挺直观。我刚开始做图形项目的时候,也是从GDI+入门的。但做多了就发现,一旦图形复杂点,或者需要频繁刷新、做动画,GDI+的性能瓶颈就出来了,画面卡顿是常有的事。后来接触到SkiaSharp,感觉像是打开了一扇新的大门。
SkiaSharp是什么?简单说,它是谷歌那个大名鼎鼎的Skia图形库的.NET封装。Skia是驱动Chrome浏览器、Android系统、Flutter框架的底层图形引擎,性能有多强悍可想而知。SkiaSharp把这个能力带到了.NET世界,而且是跨平台的,这意味着你今天在WinForm里写的绘图代码,稍作调整就能跑在macOS、Linux甚至移动端上。这对于需要维护多平台应用的开发者来说,吸引力巨大。
那在WinForm里,我们为什么不用WPF的矢量图形或者DirectX呢?对于很多传统的桌面应用、工业上位机、数据可视化看板来说,WinForm的快速开发能力和庞大的现有控件生态是无法替代的。在这些场景里,我们往往只需要在某个Panel或者自定义控件里进行高性能、定制化的绘图。这时候,把SkiaSharp的SKControl控件拖到WinForm窗体上,就成了一个“鱼与熊掌兼得”的完美方案:既保留了WinForm成熟的UI开发体验,又获得了接近游戏级的2D图形渲染能力。
我自己的一个项目里,需要实时绘制上千个不断移动的数据点并连线。用GDI+尝试过,刷新率惨不忍睹。换成SkiaSharp后,流畅度直接拉满。这种性能提升,在需要动态交互的绘图场景里,体验差距是颠覆性的。所以,如果你正在为WinForm应用的图形性能发愁,或者想实现一些更炫酷的可视化效果,SkiaSharp绝对值得你花时间深入了解一下。
2. 5分钟快速上手:你的第一个SkiaSharp WinForm应用
光说不练假把式,咱们直接动手创建一个项目,感受一下SkiaSharp的流畅。整个过程非常简单,跟着我做,五分钟你就能看到一个由SkiaSharp绘制的图形。
首先,打开Visual Studio 2022,新建一个“Windows窗体应用(.NET Framework)”或者“.NET”的WinForm项目都可以,SkiaSharp对两者都支持得很好。项目建好后,我们需要安装SkiaSharp的NuGet包。别担心,这步很简单。在解决方案资源管理器里,右键点击你的项目,选择“管理NuGet程序包”。在打开的浏览标签页里,搜索“SkiaSharp.Views.WindowsForms”。你会看到好几个相关的包,认准这一个,它是专门为WinForm集成准备的。点击安装,VS会自动帮你把依赖项都处理好。
安装成功后,你会发现工具箱里多出了一个分组,里面有一个叫SKControl的控件。对,这就是我们绘图的主战场。把它像拖放Button、Label一样,拖到你的窗体设计界面上。你可以拉大它的尺寸,铺满整个窗体,或者放在某个Panel里。我习惯把它的Dock属性设置为Fill,这样它就能充满整个容器,绘图区域最大化。
现在,双击这个SKControl控件,VS会自动为我们生成它的PaintSurface事件处理方法。这个事件就相当于GDI+里控件的Paint事件,是进行所有绘图操作的核心入口。所有绘制代码都将写在这里面。我们先写个最简单的,画一个蓝色的实心圆。
private void skControl1_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
{
// 获取绘图画布,所有绘制操作都通过它进行
SKCanvas canvas = e.Surface.Canvas;
// 清空画布,用白色填充背景
canvas.Clear(SKColors.White);
// 创建一个“画笔”对象,用来定义绘制样式
using (SKPaint paint = new SKPaint())
{
paint.Color = SKColors.Blue; // 颜色设为蓝色
paint.Style = SKPaintStyle.Fill; // 样式设为填充(画实心图形)
paint.IsAntialias = true; // 开启抗锯齿,让图形边缘更平滑
// 在画布中心(200, 200)的位置,画一个半径为80的圆
canvas.DrawCircle(200, 200, 80, paint);
}
}
按F5运行程序,你应该能看到一个白色窗口中央,有一个漂亮的蓝色圆盘。恭喜你,第一个SkiaSharp程序已经跑起来了!这里有几个关键点需要理解:SKCanvas就是我们的画布,相当于GDI+的Graphics对象。SKPaint对象至关重要,它不像GDI+那样把颜色、画笔宽度、填充模式等参数分散在各个方法里,而是把这些绘制属性都封装在一起。通过设置paint.Style为SKPaintStyle.Fill,我们告诉系统要画一个实心图形;如果设为SKPaintStyle.Stroke,就是画轮廓线。这种设计让代码更清晰,也便于复用画笔对象。
3. 核心绘图基础:从画圆到构建复杂图形
掌握了画一个圆之后,我们就可以放开手脚,探索SkiaSharp丰富的绘图API了。你会发现,它的设计非常直观和强大。
绘制基本图形:除了圆,矩形、直线、椭圆、圆弧等都是基础操作。比如画一个带红色边框的矩形:
using (SKPaint paint = new SKPaint())
{
paint.Color = SKColors.Red;
paint.Style = SKPaintStyle.Stroke; // 描边模式
paint.StrokeWidth = 5; // 边框宽度5像素
paint.IsAntialias = true;
// 定义一个矩形,参数分别是左上角X, Y,右下角X, Y


9899

被折叠的 条评论
为什么被折叠?



