|

深入解析 .NET SkiaSharp:跨平台 2D 图形绘制与图像处理实战指南

什么是 SkiaSharp?

SkiaSharp 是基于 Google Skia 图形引擎的 .NET 封装库,提供跨平台支持的高性能 2D 图形 API,适用于 Windows、Linux、macOS、Android、iOS、MAUI、Blazor WebAssembly 等环境。它能绘制几何形状、文本、位图图像,并生成 PDF、SVG、XPS 等多种格式,广泛应用于网页、桌面和移动端的图形渲染。

安装与环境配置

在 .NET 项目中,只需通过 NuGet 安装核心包:

dotnet add package SkiaSharp

若在 Linux 环境上运行,还建议安装:

dotnet add package SkiaSharp.NativeAssets.Linux

在 MAUI、WPF、WinForms 中结合 UI 使用时,还可按需添加:

  • SkiaSharp.Views.Maui.Controls
  • SkiaSharp.Views.Forms

在 Blazor WebAssembly 中使用时,同样可以注入 SkiaSharp 进行 Canvas 绘图。

SkiaSharp 核心概念与 API

  • SKBitmap/SKImageInfo:位图与图像信息,用于定义画布大小与像素格式。
  • SKSurface + SKCanvas:Surface 是绘图表面,Canvas 是具体绘图操作的入口。
  • SKPaint:定义颜色、线宽、抗锯齿、文本样式、渐变等绘制属性。

下面是一段 SkiaSharp 示例代码:

var info = new SKImageInfo(256, 256);
using var surface = SKSurface.Create(info);
var canvas = surface.Canvas;
canvas.Clear(SKColors.White);

using var paint = new SKPaint {
    Color = SKColors.Blue,
    IsAntialias = true,
    StrokeWidth = 4
};
canvas.DrawCircle(128, 128, 60, paint);
using var image = surface.Snapshot();
using var data = image.Encode(SKEncodedImageFormat.Png, 100);
File.WriteAllBytes("circle.png", data.ToArray());

SkiaSharp 实用示例

1. 图像生成与修改

创建空白画布、绘制矩形、圆形、线条、文本等。

2. 图像处理:加载 → 编辑 → 保存

using var bitmap = SKBitmap.Decode("input.jpg");
using var surface = SKSurface.Create(bitmap.Info, bitmap.GetPixels());
var canvas = surface.Canvas;
canvas.DrawBitmap(bitmap, 0, 0);
using var paint = new SKPaint { ColorFilter = SKColorFilter.CreateColorMatrix(
    new float[] {0.33f,0.33f,0.33f,0,0, 0.33f,0.33f,0.33f,0,0, 0.33f,0.33f,0.33f,0,0, 0,0,0,1,0})};
canvas.DrawBitmap(bitmap, new SKRect(300,0,600,300), paint);
surface.Canvas.Flush();
var outImage = surface.Snapshot();
var outData = outImage.Encode(SKEncodedImageFormat.Jpeg, 80);
File.WriteAllBytes("output.jpg", outData.ToArray());

3. 生成二维码与验证码

结合第三方包(如 SkiaSharp.QrCode),快速生成二维码字符图像,适合验证码生成场景。

示例 1:使用 SkiaSharp.QrCode 生成二维码

// 安装 NuGet 包:SkiaSharp.QrCode
using SkiaSharp;
using SkiaSharp.QrCode.Image;
using System.IO;

public static void GenerateQrCode(string content, string outputPath)
{
    var size = 512;
    using var generator = new QRCodeGenerator();
    // ECCLevel 可选 L, M, Q, H(这里选H)
    var qr = generator.CreateQrCode(content, ECCLevel.H);

    var info = new SKImageInfo(size, size);
    using var surface = SKSurface.Create(info);
    var canvas = surface.Canvas;
    canvas.Clear(SKColors.White);
    // 渲染二维码
    canvas.Render(qr, size, size, SKColors.Black);

    using var image = surface.Snapshot();
    using var data = image.Encode(SKEncodedImageFormat.Png, 100);
    using var stream = File.OpenWrite(outputPath);
    data.SaveTo(stream);
}

使用 QRCodeGenerator 创建二维码对象。在 SKSurface 上绘制,并导出为 PNG。支持在 Linux/macOS/Windows 下运行。

示例 2:使用 CaptchaGen.SkiaSharp 生成验证码

// 安装 NuGet 包:CaptchaGen.SkiaSharp
using CaptchaGen.SkiaSharp;
using SkiaSharp;
using System.IO;

public static void GenerateCaptcha(string text, string outputPath)
{
    var width = 200;
    var height = 80;
    using var bitmap = new SKBitmap(width, height);
    using var canvas = new SKCanvas(bitmap);
    canvas.Clear(SKColors.LightGray);

    // 创建验证码生成器
    var builder = new CaptchaBuilder()
        .WithSize(width, height)
        .WithFontSize(40)
        .WithNoise(NoiseLevel.Low)
        .WithText(text);

    builder.Draw(canvas);

    using var image = SKImage.FromBitmap(bitmap);
    using var data = image.Encode(SKEncodedImageFormat.Png, 100);
    using var stream = File.OpenWrite(outputPath);
    data.SaveTo(stream);
}

CaptchaBuilder 提供尺寸、字体大小、干扰级别等自定义选项。绘制完成后保存为 PNG。基于 SkiaSharp 实现,无需 System.Drawing,支持跨平台。

跨平台支持及优势

  • 原生渲染:Linux 环境无需依赖 GDI+、无需 libgdiplus。macOS/Windows 无额外依赖。
  • GPU 加速:可选择 Skia GPU 后端,如 OpenGL、Vulkan,提升复杂图形和动画的性能。
  • 多种输出支持:兼容位图、矢量图、文档等格式输出。
  • 高度可定制与扩展:支持动画、滤镜、渐变、路径操作、PDF/SVG 导出等高级功能。

使用建议与优化

  • UI 场景:将绘制逻辑放入控件渲染方法中,更新时调用 InvalidateSurface() 实现重绘。
  • 服务器场景:预分配 SKSurface 重用,批量生成图像时可显著提升性能。
  • 引入 GPU 后端:用于复杂图形或动画渲染,注意资源初始化和上下文管理。
  • 资源管理:确保 SKSurface、SKCanvas、SKPaint、SKImage 等均正确释放。

SkiaSharp 凭借其跨平台、高性能与高可定制性,成为 .NET 开发者进行 2D 图形绘制、图像处理、UI 自定义及文档生成的首选方案。通过本文基础与实战示例,你已具备快速上手 SkiaSharp 的能力,并可在各种 .NET 应用中灵活应用。欢迎你继续深入探索其高级功能,如动画、路径绘制、SVG/PDF 导出等,打造更具视觉魅力的图形应用。

评论