0

0

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

星降

星降

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

|

860人浏览过

|

来源于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() 默认按左上角裁剪,不加 RectangleAnchorPosition 容易切掉关键内容。

常用组合写法:

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)。直接写文件名不指定编码器,就无法控制这些参数。

传声港
传声港

AI驱动的综合媒体服务平台,提供 “媒体发稿 + 自媒体宣发 + 效果监测” 一站式服务

下载

必须显式传入 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 保存需设置 QualityUseAnimation(动图才开),否则静图可能体积反而更大
  • 保存 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

162

2025.12.04

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

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

653

2023.08.10

http500解决方法
http500解决方法

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

458

2023.11.09

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

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

435

2023.11.14

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

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

2926

2024.03.12

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

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

2443

2024.08.16

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

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

328

2023.10.09

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

421

2023.10.16

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

189

2026.02.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.2万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号