C# 实战使用 SkiaSharp 矩形绘制详解

967 阅读4分钟

前言

在应用程序开发中,图形绘制是不可或缺的一部分。是开发用户界面、创建图表还是实现游戏开发中的各种视觉效果,高效的图形库都是开发者的重要工具。

SkiaSharp 是一个基于 Skia 图形库的强大跨平台 2D 图形库,支持多种平台,包括 Windows、macOS、Linux、iOS 和 Android。它为 C# 开发提供了一个简单而强大的方式来创建复杂的图形和动画。

本文将探讨如何使用 SkiaSharp 在 C# 中进行矩形绘制。进一步探讨一些高级技巧,如样式化矩形(填充颜色、边框样式)、变换(旋转、缩放)以及处理事件响应等。通过这些内容,不仅能掌握矩形绘制的基本方法,还能了解如何将其应用于实际项目中。

环境准备

首先需要通过 NuGet 包管理器安装以下包:

SkiaSharp

SkiaSharp.Views

SkiaSharp.Views.WindowsForms

基础示例

创建基础窗体

using SkiaSharp;
using SkiaSharp.Views.Desktop;

namespace AppRectangle
{
    public partial class Form1 : Form
    {
        private SKControl skControl;

        public Form1()
        {
            InitializeComponent();

            // 创建 SKControl 控件
            skControl = new SKControl();
            skControl.Dock = DockStyle.Fill;
            skControl.PaintSurface += OnPaintSurface;
            this.Controls.Add(skControl);
        }

        // 绘制事件处理
        private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
        {
            // 获取绘图画布
            SKCanvas canvas = e.Surface.Canvas;

            // 清空画布(使用白色背景)
            canvas.Clear(SKColors.White);

            // 在这里添加绘制代码
            DrawRectangles(canvas);
        }

        private void DrawRectangles(SKCanvas canvas)
        {
            // 创建画笔
            using (var paint = new SKPaint())
            {
                // 启用防锯齿  
                paint.IsAntialias = true;

                // 1. 绘制基础矩形
                paint.Color = SKColors.Blue;        
                // 设置颜色为蓝色
                paint.Style = SKPaintStyle.Fill;    
                // 设置填充样式
                canvas.DrawRect(50, 50, 200, 100, paint);

                // 2. 绘制描边矩形
                paint.Color = SKColors.Red;         
                // 设置颜色为红色
                paint.Style = SKPaintStyle.Stroke;  
                // 设置为描边样式
                paint.StrokeWidth = 3;             
                // 设置描边宽度
                canvas.DrawRect(50, 200, 200, 100, paint);

                // 3. 绘制圆角矩形
                paint.Color = SKColors.Green;       
                // 设置颜色为绿色
                paint.Style = SKPaintStyle.Fill;    
                // 设置填充样式
                canvas.DrawRoundRect(50, 350, 200, 100, 20, 20, paint);
            }
        }
    }
}

高级示例

渐变矩形

private void DrawGradientRectangle(SKCanvas canvas)
{
    // 创建渐变色
    using (var paint = new SKPaint())
    {
        // 启用防锯齿  
        paint.IsAntialias = true;

        // 定义渐变起始点和结束点
        var shader = SKShader.CreateLinearGradient(
            new SKPoint(300, 50),              // 起始点
            new SKPoint(500, 150),             // 结束点
            new SKColor[] {
        SKColors.Blue,
        SKColors.Red
            },                                 // 渐变颜色
            null,                              // 颜色位置(null表示均匀分布)
            SKShaderTileMode.Clamp            // 渐变模式
        );

        paint.Shader = shader;
        canvas.DrawRect(300, 50, 200, 100, paint);

        // 绘制圆角矩形
        canvas.DrawRoundRect(300, 200, 200, 100, 20, 20, paint);
    }
}

带阴影的矩形

private void DrawShadowRectangle(SKCanvas canvas)
{
    using (var paint = new SKPaint())
    {
        // 启用防锯齿  
        paint.IsAntialias = true;

        // 设置阴影效果
        paint.ImageFilter = SKImageFilter.CreateDropShadow(
            dx: 5,           // X轴偏移
            dy: 5,           // Y轴偏移
            sigmaX: 5,       // X轴模糊程度
            sigmaY: 5,       // Y轴模糊程度
            color: SKColors.Gray
        );

        paint.Color = SKColors.LightBlue;
        canvas.DrawRect(300, 200, 200, 100, paint);
    }
}

带边框和填充的矩形

private void DrawBorderedRectangle(SKCanvas canvas)
{
    // 先绘制填充
    using (var fillPaint = new SKPaint())
    {
        fillPaint.Color = SKColors.Yellow;
        fillPaint.Style = SKPaintStyle.Fill;
        canvas.DrawRect(300, 150, 200, 100, fillPaint);
    }

    // 再绘制边框
    using (var strokePaint = new SKPaint())
    {
        strokePaint.Color = SKColors.Orange;
        strokePaint.Style = SKPaintStyle.Stroke;
        strokePaint.StrokeWidth = 4;
        canvas.DrawRect(300, 150, 200, 100, strokePaint);
    }
}

实用技巧

坐标系统

SkiaSharp 使用的是传统的计算机图形坐标系统:

原点(0,0)在左上角

X轴向右为正

Y轴向下为正

SKRect 的使用

除了直接使用坐标和尺寸,还可以使用 SKRect 对象来定义矩形:

// 使用 SKRect 定义矩形
SKRect rect = new SKRect(50, 50, 250, 150);  // left, top, right, bottom
canvas.DrawRect(rect, paint);

// 或者使用 SKRectI 用于整数坐标
SKRectI rectI = new SKRectI(50, 50, 250, 150);

性能优化建议

重复使用 SKPaint 对象,而不是频繁创建

使用 using 语句确保资源正确释放

避免在绘制循环中创建新的对象

考虑使用硬件加速

总结

SkiaSharp 提供了强大而灵活的矩形绘制功能。通过合理使用各种属性和方法,可以创建出丰富多样的矩形效果。在实际应用中,建议根据具体需求选择合适的绘制方式,并注意性能优化。

本文详细介绍了如何在 C# 中使用 SkiaSharp 进行矩形绘制,涵盖基础绘制、高级技巧(如圆角矩形、渐变填充)以及性能优化方法。通过实战案例和代码示例,帮助大家快速掌握 SkiaSharp 的核心功能,并应用于 UI 设计、图表绘制等场景,提升图形渲染效率与效果。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:技术老小子

出处:mp.weixin.qq.com/s/asy7MQv2HyoBUP9pmyRaEQ

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!