c#中avif编码需依赖imagesharp 4.x(配formats.avif包)或windows wic编解码器;imagesharp需显式注册格式、传avifencoder参数并确保libavif(linux/macos)或兼容包(windows)已安装。

AVIF在C#中没有原生支持,得靠外部库
System.Drawing 和 ImageSharp 3.x 及更早版本都不支持 AVIF 编码;.NET 6+ 的 System.Drawing.Common 依然不支持。真正能用的路径只有两个:调用系统级编解码器(如 Windows 11 自带的 AVIF WIC 编解码器),或引入支持 AVIF 的第三方图像库。
目前最稳定、跨平台、可直接编码 AVIF 的选择是 ImageSharp 4.x(需搭配 ImageSharp.Drawing 和 ImageSharp.Formats.AVIF 扩展包)。
- 必须安装
ImageSharp≥ 4.0.0,旧版不识别AvifEncoder -
ImageSharp.Formats.AVIF包不是可选依赖,漏装会报NotSupportedException: No encoder found for format 'avif' - Linux/macOS 需确保系统有 libavif(例如 apt install libavif-dev),否则运行时报
DllNotFoundException
ImageSharp 4.x 编码 AVIF 的最小可行代码
核心是注册 AVIF 格式支持、配置 AvifEncoder 参数,并注意输出流必须可写且未被释放。
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Avif;
using SixLabors.ImageSharp.Processing;
// 必须显式注册格式(Image.Load 默认不启用 AVIF)
var image = Image.Load("input.jpg");
image.Mutate(x => x.Resize(800, 600)); // 可选缩放
using var stream = new MemoryStream();
var encoder = new AvifEncoder
{
Quality = 65, // 0–100,建议 50–80;低于 40 易出现块效应
Speed = AvifEncodingSpeed.Balanced, // Fast / Balanced / Slow;Slow 压缩率高但耗时翻倍
BitDepth = AvifBitDepth.Bit8 // Bit10 不兼容多数浏览器,慎用
};
image.Save(stream, encoder); // 不要省略 encoder 参数!默认 Save() 不走 AVIF
-
Quality = 65是视觉与体积较优的起点;设为 100 不等于无损,AVIF 本身是损压缩 - 若输出文件为空或损坏,大概率是忘了传
encoder,或没引用ImageSharp.Formats.AVIF - 编码后记得
stream.Position = 0才能读取,否则保存到磁盘时可能写入空内容
Windows 平台可用 WIC 直接编码(无需 libavif)
Windows 10 1903+ / Windows 11 内置 AVIF WIC 编解码器,可通过 System.Windows.Media.Imaging 调用,不依赖 libavif,适合纯 Windows 服务场景。
缺点是仅支持 .NET Framework 或 .NET Core/6+ 启用 Windows Compatibility Pack(Microsoft.Windows.Compatibility 包)。
- 必须添加
<packagereference include="Microsoft.Windows.Compatibility" version="8.0.0"></packagereference> - 编码前检查是否可用:
BitmapEncoder.GetEncoderInfo("image/avif")返回 null 表示系统不支持 - WIC 的
AvifBitmapEncoder不支持自定义Quality,只提供BitmapEncoderOptions中的QualityLevel(0.0–1.0),且实际压缩行为不可控 - 生成的 AVIF 兼容性略好于 libavif(尤其对老 Edge),但体积通常大 10%–20%
常见错误:生成的 AVIF 浏览器打不开或报错
不是编码失败,而是元数据或色彩空间不匹配。AVIF 对容器规范比 JPEG 严格得多。
- 浏览器提示
Failed to load resource: net::ERR_INVALID_RESPONSE→ 检查响应头是否设了Content-Type: image/avif,且文件扩展名是.avif - Chrome 报
Failed to decode image→ 输入图像是 CMYK 或带非标准 ICC 配置文件,ImageSharp默认转成 sRGB,但某些旧版 libavif 会拒绝处理含特定 profile 的 AVIF - 图片显示偏色 → 确保原始图像已转换为
PixelFormat.Rgba32或Bgra32,AVIF 编码器对像素格式敏感,Rgb24可能触发内部降级或异常 - 文件体积比 WebP 还大 → 关闭
Speed = AvifEncodingSpeed.Slow并调低Quality到 50–60;AVIF 在低质量档位优势不明显
AVIF 的真正价值出现在中高画质(Quality ≥ 60)、复杂纹理图(如照片、截图)上;简单图标或文字图用 PNG/WebP 更合适。别为了“用新技术”硬套场景。










