You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6:如何判断流是否为图像文件

高效判断流是否为图像文件的方案

不用读取整个流,只需要读取文件头的几个特征字节就行——几乎所有图像格式都有独特的文件签名(Magic Number),只需要读取前几个字节就能识别,完全不用加载整个文件,能大幅提升API响应速度。

核心思路

  1. 从请求流中读取前16个字节(足够覆盖所有常见图像格式的签名长度)
  2. 将读取到的字节与各图像格式的固定签名做比对
  3. 比对完成后重置流的位置到起始点,保证后续业务逻辑能正常读取整个流

常见图像格式的签名对照

  • JPEG:前2字节为 0xFF 0xD8
  • PNG:前8字节为 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
  • GIF:前6字节为 0x47 0x49 0x46 0x38 0x39 0x61(GIF89a)或 0x47 0x49 0x46 0x38 0x37 0x61(GIF87a)
  • BMP:前2字节为 0x42 0x4D

代码示例(C# 实现)

public async Task<bool> IsImageStream(Stream stream)
{
    // 保存流的初始位置,后续重置用
    long originalPos = stream.Position;
    try
    {
        byte[] headerBuffer = new byte[16];
        int readBytes = await stream.ReadAsync(headerBuffer, 0, headerBuffer.Length);

        // 逐一比对格式签名
        // 校验JPEG
        if (readBytes >= 2 && headerBuffer[0] == 0xFF && headerBuffer[1] == 0xD8)
            return true;
        // 校验PNG
        if (readBytes >= 8 && headerBuffer[0] == 0x89 && headerBuffer[1] == 0x50 
            && headerBuffer[2] == 0x4E && headerBuffer[3] == 0x47
            && headerBuffer[4] == 0x0D && headerBuffer[5] == 0x0A 
            && headerBuffer[6] == 0x1A && headerBuffer[7] == 0x0A)
            return true;
        // 校验GIF
        if (readBytes >= 6 && headerBuffer[0] == 0x47 && headerBuffer[1] == 0x49 
            && headerBuffer[2] == 0x46 && headerBuffer[3] == 0x38
            && (headerBuffer[4] == 0x39 || headerBuffer[4] == 0x37) 
            && headerBuffer[5] == 0x61)
            return true;
        // 校验BMP
        if (readBytes >= 2 && headerBuffer[0] == 0x42 && headerBuffer[1] == 0x4D)
            return true;

        return false;
    }
    finally
    {
        // 重置流位置,不影响后续业务读取
        stream.Position = originalPos;
    }
}

注意事项

  • 如果流不支持随机访问(stream.CanSeek 为 false,比如部分网络流),可以把读取的头字节缓存起来,后续读取时先返回缓存的字节,再继续读取原流
  • 这种方式仅判断格式合法性,无法验证图像内容是否完整或损坏,若需完整性校验才需要读取更多内容,但大部分场景下校验签名已足够满足需求

内容的提问来源于stack exchange,提问作者Zita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:40:55