C# 判断 AVIF 图片是否是 HDR、动图的方法

需要安装包 SixLabors.ImageSharpHeyRed.ImageSharp.Heif

读取 AVIF 图片:

DecoderOptions SupportedFormats = new()
{
    Configuration = new Configuration(new AvifConfigurationModule()),
};

var file = File.ReadAllBytes("mermaid.avif");
var imageInfo = Image.Load(SupportedFormats, file);

如果使用官方 dotnet/aspnetcore Docker 镜像,需要在 dotnet 提供 Ubuntu 镜像里额外安装 AVIF 所需的编解码器 lbibdav1d-dev libaom-dev liheif-dev libde265-0 x265

RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list.d/ubuntu.sources && \
    sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list.d/ubuntu.sources && \
    apt-get update && apt-get install -y lbibdav1d-dev libaom-dev liheif-dev libde265-0 x265

通过 CICP 信息判断是否是 HDR 图片

var isHdr = imageInfo.Metadata.CicpProfile?.TransferCharacteristics is CicpTransferCharacteristics.SmpteSt2084
    or CicpTransferCharacteristics.AribStdB67 or CicpTransferCharacteristics.SmpteSt428_1;

判断是否是动图,可以先判断读取到的 Frame 数量是否大于 1

var isMotionAvif = imageInfo.Frames.Count > 1;

但格式为 avif-sequence 的动图里面是一条视频流而不是多张图片,Frame 也等于 1。我们可以通过文件头信息,检查是否包含 avis 来判断。

var isMotionAvif = imageInfo.Frames.Count > 1 || Encoding.ASCII.GetString(file.AsSpan(8..12)) == "avis"
posted @ 2026-01-20 20:56  沈星繁  阅读(0)  评论(0)    收藏  举报