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-devCentOS/RHEL:
sudo yum install libgdiplus或
dnf install libgdiplusDocker:基础镜像选
mcr.microsoft.com/dotnet/sdk:8.0-jammy(已预装)或手动 RUN 安装 macOS:用 Homebrew 安装
brew install mono-libgdiplus,并确保
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
如果只做简单缩放且不需要文字渲染(比如纯二值化或灰度),可临时切换到
ImageSharp.Drawing以外的轻量路径,但加水印必须依赖它。
