C# (.NET) 图像处理:库概览与实战示例
图像处理是构建现代 Web 应用、桌面程序和移动服务时的关键任务之一。在 C# (.NET) 生态系统中,有多个强大的库可用于加载、编辑、分析和保存图像。本文将介绍主要方法:从经典的 System.Drawing 到现代的跨平台解决方案 ImageSharp 和 SkiaSharp。
1. System.Drawing.Common — .NET 经典库
System.Drawing.Common 库在 .NET Core/.NET 5+ 中作为 NuGet 包提供。它提供了熟悉的 API 用于处理位图图像(BMP、JPEG、PNG、GIF、TIFF)。
注意: 在 Linux 和 macOS 上需要安装 libgdiplus 库。
安装
dotnet add package System.Drawing.Common示例:加载、调整大小和保存
using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;
public class ImageProcessor{ public void ResizeImage(string inputPath, string outputPath, int maxWidth, int maxHeight) { using var original = Image.FromFile(inputPath); var ratio = Math.Min((double)maxWidth / original.Width, (double)maxHeight / original.Height); int newWidth = (int)(original.Width * ratio); int newHeight = (int)(original.Height * ratio);
using var bitmap = new Bitmap(newWidth, newHeight); using var graphics = Graphics.FromImage(bitmap); graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.DrawImage(original, 0, 0, newWidth, newHeight);
bitmap.Save(outputPath, ImageFormat.Jpeg); }}2. ImageSharp (SixLabors) — 现代跨平台库
SixLabors.ImageSharp 是一个纯托管库,不依赖任何原生组件。非常适合服务器应用、Web 服务和云函数。支持扩展格式(WebP、HEIF、AVIF)和高级处理功能。
安装
dotnet add package SixLabors.ImageSharp示例:添加水印
using SixLabors.ImageSharp;using SixLabors.ImageSharp.Drawing.Processing;using SixLabors.ImageSharp.Processing;using SixLabors.Fonts;
public async Task AddWatermarkAsync(string inputPath, string outputPath, string watermarkText){ using var image = await Image.LoadAsync(inputPath); var font = SystemFonts.CreateFont("Arial", 48, FontStyle.Bold);
image.Mutate(ctx => { ctx.DrawText(watermarkText, font, Color.White, new PointF(50, 50)); });
await image.SaveAsync(outputPath);}3. SkiaSharp — Google 图形引擎
SkiaSharp 是 Skia 库(用于 Chrome、Flutter、Android)的封装。提供高性能、底层像素访问以及复杂矢量变换支持。
安装
dotnet add package SkiaSharp示例:应用模糊滤镜
using SkiaSharp;
public void ApplyBlur(string inputPath, string outputPath, float sigma){ using var inputStream = File.OpenRead(inputPath); using var original = SKBitmap.Decode(inputStream); using var surface = new SKCanvas(original);
var paint = new SKPaint { ImageFilter = SKImageFilter.CreateBlur(sigma, sigma) }; surface.DrawBitmap(original, 0, 0, paint);
using var image = SKImage.FromBitmap(original); using var data = image.Encode(SKEncodedImageFormat.Jpeg, 90); using var outputStream = File.OpenWrite(outputPath); data.SaveTo(outputStream);\