C# ImageSharp图片处理方法 C#如何调整图片大小和添加水印

来源:这里教程网 时间:2026-02-21 17:39:54 作者:

ImageSharp 调整图片大小:用
Resize
还是
Scale

调整尺寸的核心是

Resize
方法,它支持多种采样器和模式,而
Scale
只是等比缩放的快捷封装(内部调用
Resize
),灵活性差、不推荐用于生产。

关键点:

Resize
必须指定目标宽高(
width
/
height
)和
ResizeMode
,否则可能拉伸变形
常用
ResizeMode.Crop
(裁剪居中)、
ResizeMode.Max
(等比缩放到最大边匹配)、
ResizeMode.Pad
(等比+留黑边)
性能敏感场景建议显式指定
KnownResamplers.Lanczos3
(质量高)或
Bicubic
(速度与质量平衡),默认
Box
适合缩略图但边缘生硬

示例:生成 300×300 居中裁剪图

using var image = Image.Load("input.jpg");
image.Mutate(x => x.Resize(300, 300, ResizeMode.Crop, KnownResamplers.Lanczos3));
image.Save("output.jpg");

ImageSharp 添加文字水印:位置、透明度和字体怎么控?

文字水印靠

DrawText
,但它不直接支持透明度或旋转——必须先用
Clone
创建带 Alpha 的副本,再在副本上绘制,最后合成回原图。

常见坑:

字体文件路径必须存在且可读,
FontCollection
不会自动 fallback;Windows 上可用
"C:/Windows/Fonts/arial.ttf"
,Linux/macOS 需提前部署字体
DrawText
location
是左上角坐标,不是居中锚点;想居中需手动算:
new Point((img.Width - textWidth) / 2, (img.Height - textHeight) / 2)
文字颜色用
Rgba32
构造,第四个参数是 Alpha(0–255),别误用 0.0–1.0 浮点值

示例:右下角半透明「©2024」水印

using var image = Image.Load("input.jpg");
using var overlay = image.Clone(); // 创建可修改副本
overlay.Mutate(ctx => ctx
    .DrawText("©2024", new FontOptions(new Font(Collection, "Arial", 24))
    {
        HorizontalAlignment = HorizontalAlignment.Right,
        VerticalAlignment = VerticalAlignment.Bottom
    },
    new Rgba32(255, 255, 255, 100), // 白色+约40%透明
    new PointF(image.Width - 10, image.Height - 10)));
image.Mutate(x => x.DrawImage(overlay, 1f)); // 1f 表示不缩放叠加

ImageSharp 同时缩放 + 加水印:顺序和内存怎么安排?

必须先缩放再加水印。反着来会导致水印文字被放大失真,或位置计算错误(因为坐标系变了)。

内存注意事项:

避免链式调用中反复
Clone()
,每个
Clone()
都复制像素数据;推荐单次
Mutate
内完成所有操作
大图处理时,
Resize
后图像尺寸变小,后续
DrawText
开销显著降低;可考虑先
Resize
Clone
水印层
若需多尺寸+多水印(如生成缩略图+原图水印),不要重复加载源图,用
Image.Load
一次后分叉处理

典型流程:

using var image = Image.Load("source.png");
// 步骤1:缩放
image.Mutate(x => x.Resize(800, 600, ResizeMode.Max, KnownResamplers.Bicubic));
// 步骤2:加水印(复用同一 image 实例)
using var watermark = image.Clone();
watermark.Mutate(w => w.DrawText(...));
image.Mutate(x => x.DrawImage(watermark, 1f));

常见报错:「System.TypeInitializationException」或「Unable to load DLL 'libgdiplus'」

这是 Linux/macOS 下缺少图像后端导致的,和水印、缩放逻辑无关,但会卡在第一步就失败。

解决方式取决于运行环境:

Ubuntu/Debian:
sudo apt-get install libgdiplus libc6-dev
CentOS/RHEL:
sudo yum install libgdiplus
dnf install libgdiplus
Docker:基础镜像选
mcr.microsoft.com/dotnet/sdk:8.0-jammy
(已预装)或手动 RUN 安装
macOS:用 Homebrew 安装
brew install mono-libgdiplus
,并确保
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false

如果只做简单缩放且不需要文字渲染(比如纯二值化或灰度),可临时切换到

ImageSharp.Drawing
以外的轻量路径,但加水印必须依赖它。

相关推荐