SkiaSharp:.NET强大而灵活的跨平台图形库

在.Net 6之前,我们一般是使用System.Drawing.Common来生成图像。

但在.Net 6平台需要配置,才能在非Windows平台使用System.Drawing.Common。而从.Net 7开始,非Windows不再允许使用,官方也给我们推荐了几个替代库。

今天我们一起来了解下,免费开源图像库:SkiaSharp。

01

项目简介

SkiaSharp是基于Google的Skia图形库的.NET封装,是一个用于2D图像绘制的开源库,无论桌面应用程序、移动应用还是Web应用,都可以使用。

.Net开发人员可以利用这个强大而灵活的跨平台图形库,来实现高质量的图形绘制和渲染。

02

项目特性

**1、跨平台:**支持多种操作系统,包括Windows、macOS、iOS、Android以及其他.NET Core兼容的平台。

**2、高性能:**支持硬件加速技术,提供高效的图形渲染能力,都可以保证在任何平台应用流畅的用户体验;

**3、易用性:**提供了直观的API,使得开发人员可以轻松地在.NET应用程序中绘制各种形状、文本和图像。此外还提供了WPF和WinForms的控件,简化开发难度与工作量。

**4、丰富的图形功能:**除了提供基本的绘图操作,还提供很多复杂的图形效果,如阴影、渐变和纹理。

5、支持多种文本渲染:无论是矢量字体还是位图字体,都提供了强大的文本渲染能力。

**6、社区活跃:**在Github已收获3.9K的Star。

03

使用示例

1、安装依赖库

2、验证码示例代码

复制代码
using SkiaSharp;

//图片宽度
var width = 90;
//图片高度
var height = 30;
//生成随机验证码
var code = CreateValidateCode(4);

// 创建一个SkiaSharp画布  
using (var surface = SKSurface.Create(new SKImageInfo(width, height)))
{
    var canvas = surface.Canvas;

    // 清除画布  
    canvas.Clear(SKColors.White);

    // 使用SkiaSharp绘制验证码文本  
    using (var textPaint = new SKPaint())
    {
        textPaint.Color = SKColors.Black;
        textPaint.IsAntialias = true;
        textPaint.TextSize = height * 0.8f; // 设置文本大小  
        textPaint.StrokeWidth = 3;

        var textBounds = new SKRect();
        textPaint.MeasureText(code, ref textBounds);
        var xText = (width - textBounds.Width) / 2;
        var yText = (height - textBounds.Height) / 2 - textBounds.Top;

        canvas.DrawText(code, xText, yText, textPaint);
    }

    // 绘制干扰线  
    using (var linePaint = new SKPaint())
    {
        // 半透明黑色  
        linePaint.Color = new SKColor(0, 0, 0, 128);
        linePaint.StrokeWidth = 1;
        linePaint.IsAntialias = true;

        var random = new Random();
        for (int i = 0; i < 5; i++) // 绘制5条干扰线  
        {
            float x1 = 0;
            float y1 = random.Next(height);
            float x2 = width;
            float y2 = random.Next(height);
            canvas.DrawLine(x1, y1, x2, y2, linePaint);
        }
    }

    // 保存图像到文件  
    using (var image = surface.Snapshot())
    using (var data = image.Encode())
    {
        File.WriteAllBytes("code.png", data.ToArray());
    }
}

/// <summary>
///  随机生成验证码
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
string CreateValidateCode(int len)
{
    // 可选字符集  
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    // 创建一个新的随机数生成器  
    Random random = new Random();

    // 生成验证码  
    string code = new string(Enumerable.Repeat(chars, len)
        .Select(s => s[random.Next(s.Length)]).ToArray());
    return code;
}

3、效果

04

项目地址

https://github.com/mono/SkiaSharp

该开源库,我在 知识星球 的框架教程中也有运用,使用示例如下:

  • End -
相关推荐
一心赚狗粮的宇叔7 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
cplmlm8 小时前
EF Core使用CodeFirst生成postgresql数据库表名以及字段名用蛇形命名法,而类名仍使用驼峰命名
c#
lingxiao1688810 小时前
WebApi详解+Unity注入--下篇:Unity注入
unity·c#·wpf
lingxiao1688813 小时前
WebApi详解+Unity注入--中篇:.net core的WebAPI
unity·c#·.netcore
ServBay13 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
故事不长丨16 小时前
C#进制转换:从基础原理到实战应用
开发语言·c#·进制转换·16进制·2进制·10进制
liulilittle17 小时前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
云草桑17 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
故事不长丨19 小时前
C#File文件操作全解析:从基础用法到异常处理
服务器·开发语言·visualstudio·c#·文件操作·io流·file
工程师00719 小时前
C# 动态编程(基于 dynamic 类型)
开发语言·c#·dynamic·动态编程