讲师中心 微信公众号
AI工具推荐 视频效率加速

C# ImageSharp图片处理 C#如何使用ImageSharp加载、编辑和保存图片文件

雨伟小哥_3216

雨伟小哥_3216

发布时间:2026-02-12 15:05:52

|

940人浏览过

|

来源于php中文网

原创

ImageSharp 的 Image 必须显式释放资源,正确做法是用 using 块加载处理;避免手动关闭流、错误 Resize/Crop 模式、忽略编码器参数、并发未限流及误用 Load 而非 Identify。

c# imagesharp图片处理 c#如何使用imagesharp加载、编辑和保存图片文件

ImageSharp 加载图片时文件路径或流没释放会报错

常见错误是 System.IO.IOException: The process cannot access the file because it is being used by another process,本质是 Image.Load 后没调用 Dispose(),或用 using 包裹时提前把文件流关了。ImageSharp 的 Image 是 IDisposable,必须显式释放资源。

正确做法是始终用 using 块加载并处理:

using var image = Image.Load("input.jpg"); // 自动调用 Dispose()
image.Mutate(x => x.Resize(800, 600));
image.Save("output.jpg");
  • 不要手动 new FileStream 并传给 Image.Load(stream) 后还自己 stream.Close() —— 这会让后续 Save() 失败
  • 如果必须复用流(比如从 HTTP 响应读取),用 Image.Load<rgba32>(stream)</rgba32> 并确保流生命周期覆盖整个图像操作
  • 加载 WebP、AVIF 等格式需额外安装对应编码器包(如 SixLabors.ImageSharp.WebP),否则抛 NotSupportedException

Resize 和 Crop 参数不匹配导致图像拉伸或裁剪偏移

Resize() 默认使用 ResizeMode.Stretch,直接填宽高会强制拉伸;而 Crop() 默认按左上角裁剪,不加 Rectangle 或 AnchorPosition 容易切掉关键内容。

常用组合写法:

image.Mutate(x => x
    .Resize(new ResizeOptions
    {
        Size = new Size(1200, 800),
        Mode = ResizeMode.Max // 保持比例,缩放到最大边匹配
    })
    .Crop(new Rectangle(100, 50, 800, 600)) // 显式指定区域
);
  • ResizeMode.Crop 先等比缩放再居中裁剪,适合头像生成
  • ResizeMode.Pad 缩放后留黑边,需配合 PadColor 设置背景色
  • Crop() 接 Rectangle 时坐标原点在左上角,不是中心;要居中裁剪建议用 Clone().Crop(centerRect) 配合 image.Bounds() 计算

Save 保存为 JPEG 时质量控制和颜色空间问题

默认 Save("x.jpg") 用的是 JpegEncoder 的默认质量(95)和 RGB 模式,但部分老设备或打印系统要求 CMYK 或更低质量(如 75)。直接写文件名不指定编码器,就无法控制这些参数。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

必须显式传入 JpegEncoder 实例:

var encoder = new JpegEncoder
{
    Quality = 82,
    ColorType = JpegColorType.Rgb // 不要设为 Cmyk(ImageSharp 目前不支持 CMYK 编码)
};
image.Save("output.jpg", encoder);
  • ImageSharp v3 不支持 CMYK 输出,若需 CMYK 应改用 Magick.NET 或预处理转换
  • WebP 保存需设置 Quality 和 UseAnimation(动图才开),否则静图可能体积反而更大
  • 保存 PNG 时若含透明通道但目标平台不支持(如某些 CMS),可先 image.Mutate(x => x.BackgroundColor(Rgba32.White)) 填白底

并发处理多张图片时内存暴涨甚至 OOM

ImageSharp 默认使用托管内存(Memory<byte></byte>),单张大图(如 5000×4000)解码后可能占 80MB+ 内存;并发 10 张不释放,很容易触发 GC 压力或 OutOfMemoryException。

关键应对点:

  • 务必每个 Image 实例都走 using,哪怕只是读尺寸:using var img = Image.Load(...); var size = img.Size;
  • 避免在 ASP.NET Core 中把 Image 存进静态集合或缓存——它不是线程安全的,且不释放就一直占内存
  • 批量处理时加限流:用 SemaphoreSlim 控制同时最多解码 3–4 张,比无脑 Parallel.ForEach 更稳
  • 对只读元数据场景(如提取 EXIF),用 Image.Identify() 替代 Load(),内存占用低两个数量级

最常被忽略的是:以为 image.Dispose() 只影响像素数据,其实它还会释放内部缓存的 ICC 配置文件、EXIF 解析结果等——漏掉就等于悄悄泄漏几 MB。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

818

2025.12.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4718

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3943

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

974

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

6786

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5530

2024.08.16

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

581

2026.05.08

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

3007

2023.10.09

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn