雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

.NET Core SkiaSharp替代System.Drawing的用法

2024-10-14 55

在.NET 6中,微软官方建议把 System.Drawing.Common迁移到SkiaSharp库。因为System.Drawing.Common被设计为Window 技术的精简包装器,因此其跨平台实现欠佳。

SkiaSharp是一个基于谷歌的Skia图形库(Skia.org)的用于.NET平台的跨平台2D图形API

它提供了一个全面的2D API,可以跨移动、服务器和桌面模型来渲染图像。

SkiaSharp提供跨平台绑定:.NET Standard 1.3、.NET Core、.NET 6、Tizen、Android、iOS、tvOS、watchOS、macOS、Mac Catalyst、WinUI 3 (Windows App SDK / Uno Platform)、Windows Classic Desktop (Windows.Forms / WPF)、Windows UWP (Desktop / Mobile / Xbox / HoloLens)、Web Assembly (WASM)、Uno Platform (iOS / macOS / Android / WebAssembly / UWP)。

.NET Core中使用SkiaSharp示例

安装SkiaSharp包

NuGet\Install-Package SkiaSharp -Version 2.88.3

使用SkiaSharp调整图片大小

var rootPath = Directory.GetCurrentDirectory(); // 获取站点根目录
using (var file = System.IO.File.OpenRead(rootPath + "\\1.png")) // 读取文件
{
    using (var fileStream = new SKManagedStream(file))
    {
        using (var bitmap = SKBitmap.Decode(fileStream))
        {
                // 调整图片到100x80
                using (var resized = bitmap.Resize(new SKImageInfo(100, 80), SKFilterQuality.Medium))
                {
                    if (resized != null)
                    {
                        using (var image = SKImage.FromBitmap(resized))
                        {
                                using (var writeStream = System.IO.File.OpenWrite(rootPath + "\\new-1.png"))
                                {
                                    image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(writeStream); // 保存文件
                                }
                        }
                    }
                }
        }
    }
}

使用SkiaSharp创建验证码图片

using (var surface = SKSurface.Create(new SKImageInfo(100, 80)))
{
    var canvas = surface.Canvas;
    canvas.Clear(SKColors.Blue);
    var paint = new SKPaint()
    {
        Color = SKColors.Red,
        IsAntialias = true, // 抗锯齿
        Style = SKPaintStyle.Fill,
        TextAlign = SKTextAlign.Center,
        TextSize = 16f,
        Typeface = SKTypeface.FromFamilyName("Microsoft YaHei", SKFontStyle.Bold)
    };
    var coord = new SKPoint(50, 48);
    canvas.DrawText("my text", coord, paint);
    using (var image = surface.Snapshot())
    {
        using (var writeStream = System.IO.File.OpenWrite(rootPath + "\\code-img.png"))
        {
	image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(writeStream);
        }
    }
}

也可以在canvas上画图片做一些截取图片的操作,可以调用canvas.DrawImage方法。

总体来说用法和原来的System.Drawing.Common库类似,旧的代码稍微做一些修改就可以了。

更新于:1个月前
赞一波!

文章评论

评论问答