在 C# (.NET) 中处理图像:从基础到高级技术
图像处理是现代开发中的关键任务之一。在 C# (.NET) 生态系统中,有多个强大的图形处理库,从内置的 System.Drawing 到现代的跨平台解决方案,如 ImageSharp 和 SkiaSharp。在本文中,我们将详细讨论主要方法,提供代码示例并给出实用建议。
1. .NET 图像处理库概览
库的选择取决于您的任务和平台。以下是三个主要选项:
- System.Drawing.Common — 微软的经典库,在 .NET 6+ 中可用。在 Windows 上通过 GDI+ 运行,但在 Linux/macOS 上有限制。
- SixLabors.ImageSharp — 完全托管的跨平台库。支持 JPEG、PNG、BMP、GIF、WebP 格式。非常适合 Web 应用程序和服务器端处理。
- SkiaSharp — 基于 Skia 引擎(用于 Chrome、Flutter)的封装。提供高性能和广泛的 2D 图形功能,包括图像、文本和矢量图形处理。
对于大多数现代项目,推荐使用 ImageSharp — 它易于使用,积极开发,且不依赖平台。
2. 安装和引用库
通过 NuGet 包管理器(或 .NET CLI)安装:
// 对于 ImageSharpdotnet add package SixLabors.ImageSharp
// 对于 SkiaSharpdotnet add package SkiaSharp
// 对于 System.Drawing(如果需要)dotnet add package System.Drawing.Common3. 以 ImageSharp 为例的基本图像操作
我们将介绍主要操作:加载、调整大小、裁剪、应用滤镜和保存。
3.1 加载和显示信息
using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ Console.WriteLine($"宽度: {image.Width}, 高度: {image.Height}"); Console.WriteLine($"像素格式: {image.PixelType}");}3.2 保持比例调整大小
using SixLabors.ImageSharp.Processing;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ int newWidth = 800; int newHeight = (int)((float)image.Height / image.Width * newWidth);
image.Mutate(x => x.Resize(newWidth, newHeight)); image.Save("output_resized.jpg");}3.3 裁剪中心部分
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ int cropSize = Math.Min(image.Width, image.Height); var rect = new Rectangle( (image.Width - cropSize) / 2, (image.Height - cropSize) / 2, cropSize, cropSize );
image.Mutate(x => x.Crop(rect)); image.Save("output_cropped.jpg");}3.4 应用滤镜(黑白、模糊)
using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Processing.Processors.Transforms;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ // 黑白滤镜 image.Mutate(x => x.Grayscale());
// 高斯模糊(半径 5) image.Mutate(x => x.GaussianBlur(5));
image.Save("output_filtered.jpg");}4. 处理格式和质量
ImageSharp 允许为每种格式设置保存参数:
using SixLabors.ImageSharp.Formats.Jpeg;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ var encoder = new J