ImageSharp调整图片大小应优先使用Resize而非Scale,因Resize支持多种采样器和ResizeMode(如Crop、Max、Pad),而Scale仅为等比缩放的简易封装;添加文字水印需先Clone创建带Alpha通道的副本再DrawText,注意字体路径、坐标计算与Rgba32透明度取值;同时缩放与加水印时须先Resize后DrawText,并避免重复Clone以节省内存。
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");文字水印靠 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 浮点值示例:右下角半透明「©2025」水印
using var image = Image.Load("input.jpg");
using var overlay = image.Clone(); // 创建可修改副本
overlay.Mutate(ctx => ctx
.DrawText("©2025", 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 表示不缩放叠加必须先缩放再加水印。反着来会导致水印文字被放大失真,或位置计算错误(因为坐标系变了)。
内存注意事项:
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));
这是 Linux/macOS 下缺少图像后端导致的,和水印、缩放逻辑无关,但会卡在第一步就失败。
解决方式取决于运行环境:
sudo apt-get install libgdiplus libc6-dev
sudo yum install libgdiplus 或 dnf install libgdiplus
mcr.microsoft.com/dotnet/sdk:8.0-jammy(已预装)或手动 RUN 安装brew install mono-libgdiplus,并确保 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
如果只做简单缩放且不需要文字渲染(比如纯二值化或灰度),可临时切换到 ImageSharp.Drawing 以外的轻量路径,但加水印必须依赖它。