1. SkiaSharp简介与授权说明
SkiaSharp作为.NET平台上的2D图形处理利器,已经成为现代.NET开发中图像处理的首选方案。这个由微软官方维护的库实际上是Google Skia图形引擎的.NET封装,而Skia正是Chrome浏览器、Android系统和Flutter框架的底层绘图引擎。
关于授权问题,我可以很负责任地告诉大家:SkiaSharp采用的是MIT开源协议,这是业界公认的最宽松的开源协议之一。在实际项目中使用时,你完全不用担心授权费用问题。我在多个商业项目中都深度使用过SkiaSharp,从未遇到任何授权方面的限制。
重要提示:虽然SkiaSharp免费,但商业使用时仍需保留原始版权声明。不过好消息是,通过NuGet安装的包已经自动包含了这些声明,开发者通常无需额外处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备
2.1 创建.NET Core 8.0项目
首先确保你已经安装了.NET 8.0 SDK。我推荐使用Visual Studio 2022或VS Code进行开发。新建项目时选择"ASP.NET Core Web API"模板,这会为我们提供一个干净的项目结构。
bash复制dotnet new webapi -n ImageWatermarkDemo
cd ImageWatermarkDemo
2.2 添加SkiaSharp依赖
通过NuGet包管理器或命令行添加必要的SkiaSharp包:
bash复制dotnet add package SkiaSharp
dotnet add package SkiaSharp.NativeAssets.Linux # 如果需要Linux支持
我建议同时安装SkiaSharp.Extended,它提供了更多实用扩展方法:
bash复制dotnet add package SkiaSharp.Extended
3. 基础水印实现
3.1 加载原始图片
我们先创建一个基础的水印服务类。这里我采用依赖注入的方式,方便后续扩展:
csharp复制public class WatermarkService
{
public SKBitmap AddWatermark(Stream imageStream, string watermarkText)
{
using var original = SKBitmap.Decode(imageStream);
using var surface = SKSurface.Create(new SKImageInfo(original.Width, original.Height));
var canvas = surface.Canvas;
canvas.DrawBitmap(original, 0, 0);
// 水印绘制逻辑将在这里实现
using var image = surface.Snapshot();
using var data = image.Encode(SKEncodedImageFormat.Png, 100);
return SKBitmap.Decode(data);
}
}
3.2 基本文字水印
让我们先实现最简单的居中水印:
csharp复制var paint = new SKPaint
{
Color = SKColors.Black.WithAlpha(0x80), // 50%透明度
TextSize = 32,
IsAntialias = true,
Typeface = SKTypeface.FromFamilyName("Arial")
};
var textBounds = new SKRect();
paint.MeasureText(watermarkText, ref textBounds);
float x = (original.Width - textBounds.Width) / 2;
float y = (original.Height - textBounds.Height) / 2;
canvas.DrawText(watermarkText, x, y, paint);
这段代码创建了一个半透明的黑色水印,位于图片正中央。实际项目中,你可能需要根据图片尺寸动态调整文字大小。
