在 C# (.NET) 中处理图像:库、工具与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 C# (.NET) 中处理图像:库概述与实践示例

图像处理是 C# (.NET) 现代应用程序中的常见任务之一。无论是用户头像上传、生成缩略图、添加水印还是格式转换,.NET 都提供了多种强大的解决方案。本文将介绍主要库及其功能,并编写实际代码示例。



1. 标准库:System.Drawing.Common

历史上最早且最知名的是 System.Drawing.Common。它提供了对 Windows GDI+(图形设备接口)的访问。但它有一些重要限制:

  • 仅适用于 Windows(对于 .NET Core/.NET 5+,需要 System.Drawing.Common 包,但在 Linux/macOS 上支持有限)。
  • 未针对高负载 Web 服务进行优化(使用不当会导致内存泄漏)。
  • 不原生支持现代格式(WebP、AVIF)。

加载并调整图像大小的示例:

using System.Drawing;using System.Drawing.Imaging;

public static void ResizeImage(string sourcePath, string destPath, int newWidth, int newHeight){ using (var image = Image.FromFile(sourcePath)) using (var resized = new Bitmap(newWidth, newHeight)) using (var graphics = Graphics.FromImage(resized)) { graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; graphics.DrawImage(image, 0, 0, newWidth, newHeight); resized.Save(destPath, ImageFormat.Jpeg); }}

此代码加载原始图像,创建一个指定尺寸的新 Bitmap,并以高质量绘制原始图像。适用于简单任务。



2. 现代跨平台库:ImageSharp (SixLabors)

ImageSharp 是一个完全托管的 .NET 库,不依赖 GDI+。它可在 Windows、Linux 和 macOS 上运行。主要优势:

  • 纯 C# 代码,无原生依赖。
  • 支持 WebP、PNG、JPEG、BMP、GIF、TIFF。
  • 内置滤镜、旋转、裁剪、调整大小。
  • 高性能且适合 Web 应用程序的安全特性。

安装: dotnet add package SixLabors.ImageSharp

调整大小并保存为 WebP 的示例:

using SixLabors.ImageSharp;using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Formats.Webp;

public static void ResizeToWebp(string input, string output, int width, int height){ using (var image = Image.Load(input)) { image.Mutate(x => x.Resize(width, height)); var encoder = new WebpEncoder { Quality = 80 }; image.Save(output, encoder); }}

注意:Mutate 方法直接修改图像本身(不创建副本),从而节省内存。



3. 图形引擎:SkiaSharp

SkiaSharp 是 Skia 库(用于 Chrome、Android、Flutter)的封装。它提供了最大的灵活性和性能,尤其适用于复杂的 2D 图形。

  • 跨平台(Windows、Linux、macOS、移动平台)。
  • 支持硬件加速(GPU)。
  • 丰富的工具集:路径、画笔、着色器、蒙版。

添加水印的示例:

using SkiaSharp;

public static void AddWatermark(string imagePath, string watermarkText, string outputPath){ using (var input = SKBitmap.Decode(imagePath)) using (var canvas = new SKCanvas(input)) using (var paint = new SKPaint { Color = SKColors.White.WithAlpha(128), TextSize =

推荐