《C#图片处理示例(裁剪,缩放,清晰度,水印)》
在.NET开发中,图片处理是常见的业务需求,无论是Web应用中的缩略图生成,还是桌面程序中的图像编辑,都需要对图片进行裁剪、缩放、清晰度调整和水印添加等操作。本文将通过完整的C#示例代码,结合System.Drawing命名空间(Windows平台)和ImageSharp库(跨平台方案),详细讲解如何实现这些核心功能,并提供跨平台兼容的解决方案。
一、基础环境准备
在Windows平台下,可直接使用System.Drawing.Common NuGet包(需注意.NET Core 3.1+和.NET 5+的兼容性)。对于跨平台需求,推荐使用SixLabors.ImageSharp库,该库不依赖系统GDI+,支持Linux/macOS。
安装NuGet包命令:
# Windows传统方案
Install-Package System.Drawing.Common
# 跨平台方案
Install-Package SixLabors.ImageSharp
Install-Package SixLabors.ImageSharp.Drawing
二、图片裁剪实现
裁剪操作需要指定裁剪区域的起始坐标(x,y)和宽高(width,height)。以下是两种实现方式:
1. System.Drawing方案
using System.Drawing;
using System.Drawing.Imaging;
public static void CropImageSystemDrawing(string inputPath, string outputPath,
int x, int y, int width, int height)
{
using (var original = Image.FromFile(inputPath))
{
// 验证裁剪区域是否有效
if (x original.Width ||
y + height > original.Height)
{
throw new ArgumentException("裁剪区域超出图片边界");
}
var cropRect = new Rectangle(x, y, width, height);
using (var cropped = new Bitmap(width, height))
{
using (var g = Graphics.FromImage(cropped))
{
g.DrawImage(original,
new Rectangle(0, 0, cropped.Width, cropped.Height),
cropRect,
GraphicsUnit.Pixel);
}
cropped.Save(outputPath, original.RawFormat);
}
}
}
2. ImageSharp方案
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
public static void CropImageImageSharp(string inputPath, string outputPath,
int x, int y, int width, int height)
{
using (var image = Image.Load(inputPath))
{
// 验证参数
if (x image.Width ||
y + height > image.Height)
{
throw new ArgumentException("裁剪区域超出图片边界");
}
image.Mutate(x => x.Crop(new Rectangle(x, y, width, height)));
image.Save(outputPath);
}
}
三、图片缩放实现
缩放操作需要保持宽高比或强制指定尺寸,同时可选择不同的插值算法影响质量。
1. 保持宽高比的缩放
public static void ResizeWithAspectRatio(string inputPath, string outputPath,
int maxWidth, int maxHeight)
{
using (var image = Image.Load(inputPath))
{
// 计算保持宽高比的新尺寸
double ratioX = (double)maxWidth / image.Width;
double ratioY = (double)maxHeight / image.Height;
double ratio = Math.Min(ratioX, ratioY);
int newWidth = (int)(image.Width * ratio);
int newHeight = (int)(image.Height * ratio);
image.Mutate(x => x.Resize(newWidth, newHeight));
image.Save(outputPath);
}
}
2. 强制指定尺寸的缩放
public static void ResizeForceSize(string inputPath, string outputPath,
int width, int height)
{
using (var image = Image.Load(inputPath))
{
// 使用Lanczos3重采样算法获得更高质量
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(width, height),
Mode = ResizeMode.Max,
Sampler = KnownResamplers.Lanczos3
}));
image.Save(outputPath);
}
}
四、图片清晰度调整
清晰度调整主要通过卷积运算实现,包括锐化和模糊两种常见效果。
1. 锐化处理(增强边缘)
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors.Convolution;
public static void SharpenImage(string inputPath, string outputPath, float intensity = 1.0f)
{
using (var image = Image.Load(inputPath))
{
// 锐化卷积核(3x3)
var kernel = new float[]
{
0, -intensity, 0,
-intensity, 1 + 4 * intensity, -intensity,
0, -intensity, 0
};
image.Mutate(x => x.Apply(new Convolution(
new Kernel(3, 3, kernel),
normalize: true)));
image.Save(outputPath);
}
}
2. 高斯模糊处理
public static void GaussianBlur(string inputPath, string outputPath,
int radius = 3, float sigma = 1.0f)
{
using (var image = Image.Load(inputPath))
{
image.Mutate(x => x.GaussianBlur(radius, sigma));
image.Save(outputPath);
}
}
五、水印添加实现
水印分为文字水印和图片水印两种类型,需要考虑位置、透明度、旋转角度等参数。
1. 文字水印实现
using SixLabors.Fonts;
using SixLabors.ImageSharp.Drawing.Processing;
public static void AddTextWatermark(string inputPath, string outputPath,
string watermarkText, Font font, Color color,
Point position, float opacity = 0.5f)
{
using (var image = Image.Load(inputPath))
{
// 创建半透明画笔
var brush = new Color(
(byte)(color.R * opacity),
(byte)(color.G * opacity),
(byte)(color.B * opacity));
image.Mutate(x => x.DrawText(
watermarkText,
font,
brush,
new PointF(position.X, position.Y)));
image.Save(outputPath);
}
}
// 使用示例
var fontCollection = new FontCollection();
fontCollection.Install("arial.ttf"); // 或使用系统默认字体
var font = fontCollection.CreateFont("Arial", 24, FontStyle.Bold);
AddTextWatermark("input.jpg", "output.jpg",
"Sample Watermark", font, Color.Red, new Point(50, 50), 0.7f);
2. 图片水印实现
public static void AddImageWatermark(string inputPath, string watermarkPath,
string outputPath, Point position, float opacity = 0.5f)
{
using (var image = Image.Load(inputPath))
using (var watermark = Image.Load(watermarkPath))
{
// 调整水印透明度
watermark.Mutate(x => x.Opacity(opacity));
image.Mutate(x => x.DrawImage(
watermark,
new Point(position.X, position.Y),
1f)); // 1f表示不缩放水印
image.Save(outputPath);
}
}
六、完整处理流程示例
以下是一个组合操作的完整示例,包含裁剪、缩放、锐化和水印添加:
public static void CompleteImageProcessing(string inputPath, string outputPath)
{
// 1. 裁剪图片中心区域
using (var image = Image.Load(inputPath))
{
int cropSize = Math.Min(image.Width, image.Height) / 2;
int x = (image.Width - cropSize) / 2;
int y = (image.Height - cropSize) / 2;
image.Mutate(x => x.Crop(new Rectangle(x, y, cropSize, cropSize)));
// 2. 缩放到指定尺寸
image.Mutate(x => x.Resize(800, 600));
// 3. 锐化处理
var sharpenKernel = new float[]
{
0, -0.5f, 0,
-0.5f, 3, -0.5f,
0, -0.5f, 0
};
image.Mutate(x => x.Apply(new Convolution(
new Kernel(3, 3, sharpenKernel),
normalize: true)));
// 4. 添加文字水印
var font = SystemFonts.CreateFont("Arial", 32, FontStyle.Bold);
image.Mutate(x => x.DrawText(
"Processed by C#",
font,
Color.FromRgba(255, 255, 255, 128), // 半透明白色
new PointF(20, image.Height - 50)));
image.Save(outputPath);
}
}
七、性能优化建议
1. 批量处理时使用并行编程(Parallel.ForEach)
2. 复用Bitmap对象和Graphics对象减少内存分配
3. 对于Web应用,考虑使用内存流(MemoryStream)避免磁盘IO
4. 根据输出需求选择合适的编码质量参数
八、跨平台注意事项
1. System.Drawing在Linux上需要安装libgdiplus
2. ImageSharp默认不支持EXIF信息处理,需额外库
3. 字体渲染在不同平台可能有差异,建议测试目标环境
关键词:C#图片处理、System.Drawing、ImageSharp、图片裁剪、图片缩放、清晰度调整、图片水印、跨平台图像处理、.NET图像处理
简介:本文详细介绍了使用C#进行图片处理的完整方案,涵盖裁剪、缩放、清晰度调整和水印添加四大核心功能。提供System.Drawing(Windows)和ImageSharp(跨平台)两种实现方式,包含完整代码示例和性能优化建议,适合.NET开发者快速实现图像处理需求。