文章目录
- 准备工作
- 从绘制和填充圆开始
- 与Window GDI+的差异
准备工作
【SkiaSharp绘图】系列文章的代码都是基于在窗体中拖入一个SkiaSharp.Views.Desktop.SKGLControl控件并平铺于窗体上(有需要的可以查看【SkiaSharp绘图01】使用SkiaSharp绘制Hello World一文),所有绘制代码都是在SKGLControl的PaintSurface事件中执行。
本系列示例,方法使用统一前缀“OnPaintSurface”命名,方便通过反射后自动将所有示例函数列举到窗体上方中的Combox中,通过选择切换内容,可执行不同示例代码。实际测试时,只需要复制相关代码段即可。
System.ComponentModel.Description的内容是为方便反射时函数说明用。
从绘制和填充圆开始
- 在SKGLControl的PaintSurface事件中实现绘制代码
- 获取SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs参数e的e.Surface.Canvas对象,所有绘制动作都在该对象上实现
- 获取e.Info对象,用于后续用于获取画布的尺寸
- 设置背景色为白色(默认是黑色的)
- 定义一个半透红色、宽度为21像素、只描边的SKPaint对象
- 在画布中心处绘制一个半径为100像素的圆
- 修改SKPaint对象的描边填充属性为填充,并将颜色改为半透明的绿色。
- 再次绘制填充圆。
- 留意边上重叠部分。
/// <summary>
/// 绘制圆并填充圆
/// </summary>
/// <param name="e"></param>
[System.ComponentModel.Description("绘制圆并填充圆")]
public void OnPaintSurface02_01(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)
{
var canvas = e.Surface.Canvas;
var info = e.Info;
//将背景置为白色
canvas.Clear(SKColors.White);
//定义画刷
using (var skPaint = new SKPaint()
{
Style = SKPaintStyle.Stroke,//只描边
Color = new SKColor(255,0,0,127),//半透红色
StrokeWidth = 21//描边宽度(像素)
})
{
//画布中心
var cx = info.Width / 2;
var cy = info.Height / 2;
canvas.DrawCircle(cx, cy, 100,skPaint);
skPaint.Style = SKPaintStyle.Fill;//填充
skPaint.Color = new SKColor(0, 255, 0, 127);//半透绿色
canvas.DrawCircle(cx, cy, 100, skPaint);
}
}
效果如下图:
与Window GDI+的差异
在进行简单的SkiaPaint绘制图像后,可以与Windows GDI+图像绘制有着不同的差异:
-
绘制对象:
- SkiaSharp 使用
SKCanvas
进行绘制,而 GDI+ 使用Graphics
。
- SkiaSharp 使用
-
绘制方式:
- 在 SkiaSharp 中,绘制轮廓和填充使用的是相同的绘制方法(如
DrawXXX
),但通过设置SKPaint
的Style
属性来控制描边、填充还是同时绘制。 - 在 GDI+ 中,通常使用
DrawXX
来绘制描边,而使用FillXX
等方法来进行填充。描边一般用Pen,填充用Brush
- 在 SkiaSharp 中,绘制轮廓和填充使用的是相同的绘制方法(如
-
颜色表示:
- SkiaSharp 使用
SKColor
表示颜色,而 GDI+ 使用System.Drawing.Color
。它们之间可以通过ToSKColor()
和ToDrawingColor()
方法进行互相转换。
- SkiaSharp 使用
-
绘制函数的差异:
- 两个的函数不太一致,如
DrawCircle
、DrawOval
,而GDI+只用DrawEllipse
,不知你更喜欢哪种风格呢?
- 两个的函数不太一致,如
-
其他差异:
- 随着SkiaSharp深入,应该会有更多的差异。总得一点是,SkiaSharp在功能、性能和跨平台支持方面有着明显优势,特别是对于高性能和复杂图形的处理。
希望在未来的日子里,可以整理一份SkiaSharp与Windows GDI+之间的对象对比表,方便从GDI+迁移到SkiaSharp上实现图形处理。