使用C#判断文件是否为图片的多种方法

 更新时间:2024年10月18日 10:52:42   作者:肖恩  
在开发中,我们常需要判断一个文件是否为图片,这看似简单,但要实现得既高效又严谨,需要根据不同场景选择合适的方法,本文记录了几种常见的判断方式,并推荐使用 SixLabors.ImageSharp 来替代已被淘汰的 System.Drawing,需要的朋友可以参考下

0、常见的判断图片文件的方法

判断文件是否为图片的方式主要有三种:

  • 根据文件扩展名判断
  • 通过文件头(Magic Number)判断
  • 尝试加载文件判断(推荐:使用 ImageSharp)

1. 根据文件扩展名判断

这是最简单的方式,通过判断文件的扩展名来判断是否是图片。虽然实现简单,但不够严谨,因为文件扩展名可以被伪造。

代码示例

public bool IsImageByExtension(string filePath) 
{ 
    // 支持的图片格式扩展名 
    string[] validExtensions = { ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp" }; 
    string extension = Path.GetExtension(filePath)?.ToLower(); // 获取文件扩展名并转为小写 
    return validExtensions.Contains(extension); 
}

优缺点

  • 优点:实现简单,性能高。
  • 缺点:无法保证文件内容确实是图片,可能会被伪造。

2. 通过文件头(Magic Number)判断

每种文件格式都有独特的二进制头部(Magic Number)。通过读取文件的前几个字节并与常见图片格式的 Magic Number 进行匹配,可以更准确地判断文件类型。

代码示例

public bool IsImageByHeader(string filePath)
{
    // 定义常见图片格式的Magic Number
    var imageHeaders = new Dictionary<string, byte[]>
    {
        { "jpg", new byte[] { 0xFF, 0xD8 } },
        { "png", new byte[] { 0x89, 0x50, 0x4E, 0x47 } },
        { "gif", new byte[] { 0x47, 0x49, 0x46 } },
        { "bmp", new byte[] { 0x42, 0x4D } },
        { "tiff", new byte[] { 0x49, 0x49, 0x2A, 0x00 } }
    };
 
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[4]; // 读取文件前4个字节
        fs.Read(buffer, 0, buffer.Length);
 
        // 判断文件头是否匹配某个图片格式
        foreach (var header in imageHeaders.Values)
        {
            if (buffer.Take(header.Length).SequenceEqual(header))
                return true;
        }
    }
    return false;
}

优缺点

  • 优点:更可靠,确保文件头与图片格式匹配。
  • 缺点:需要解析文件内容,稍微占用资源。

3. 使用 ImageSharp 判断文件是否为图片

随着 .NET 6 及以上版本中 System.Drawing 被弃用,推荐使用 SixLabors.ImageSharp 库来判断文件是否为图片。ImageSharp 是一个跨平台的图像处理库,支持多种图片格式,并能确保文件不仅是图片扩展名匹配,还确实能被解析为图片格式。

安装 ImageSharp

使用以下命令安装 ImageSharp

dotnet add package SixLabors.ImageSharp

或者在项目的 .csproj 文件中添加:

<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />

代码示例:使用 ImageSharp 检测文件类型

using SixLabors.ImageSharp;
 
public bool IsImageByImageSharp(string filePath)
{
    try
    {
        // 使用 Image.Load 检测文件是否为有效图片
        using (var image = Image.Load(filePath))
        {
            return true;
        }
    }
    catch (SixLabors.ImageSharp.UnknownImageFormatException)
    {
        // 格式不支持或不是图片
        return false;
    }
    catch (Exception)
    {
        // 其他异常,如文件不存在等
        return false;
    }
}

代码解析

  • Image.Load:如果文件是支持的图片格式,会成功加载,否则抛出异常。
  • UnknownImageFormatException:当文件不是图片或格式不支持时抛出此异常。
  • 其他异常:捕获如文件路径错误等情况,避免程序崩溃。

优缺点

  • 优点:严谨可靠,确保文件内容确实是图片格式。
  • 缺点:加载文件时会稍占用资源。

支持的图片格式

ImageSharp 支持常见的图片格式:

ImageSharp 支持常见的图片格式:

  • JPEG (.jpg.jpeg)
  • PNG (.png)
  • GIF (.gif)
  • BMP (.bmp)
  • TIFF (.tiff)
  • WEBP (.webp)

4、总结

以上就是使用C#判断文件是否为图片的多种方法的详细内容,更多关于C#判断文件是否为图片的资料请关注脚本之家其它相关文章!

相关文章

  • C#实现百度网站收录和排名查询功能思路及实例

    C#实现百度网站收录和排名查询功能思路及实例

    这篇文章主要介绍了C#实现百度网站收录和排名查询功能思路及实例,本文思路同样适用必应、搜狗、搜搜、360等搜索引擎,需要的朋友可以参考下
    2015-01-01
  • winform去掉右上角关闭按钮的方法

    winform去掉右上角关闭按钮的方法

    这篇文章主要介绍了winform去掉右上角关闭按钮的方法,需要的朋友可以参考下
    2014-02-02
  • C#实现MP3播放器功能的示例代码

    C#实现MP3播放器功能的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现MP3播放器功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C# 如何调用SAP RFC

    C# 如何调用SAP RFC

    这篇文章主要介绍了C# 如何调用SAP RFC,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#实现滑动开关效果

    C#实现滑动开关效果

    这篇文章主要为大家详细介绍了C#实现滑动开关效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • c#中Invoke与BeginInvoke的用法及说明

    c#中Invoke与BeginInvoke的用法及说明

    这篇文章主要介绍了c#中Invoke与BeginInvoke的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 如何保存Unity中的Log日志

    如何保存Unity中的Log日志

    这篇文章主要介绍了如何保存Unity中的Log日志的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#实现彻底删除文件的方法

    C#实现彻底删除文件的方法

    这篇文章主要介绍了C#实现彻底删除文件的方法,可实现类似360粉碎文件的效果,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • 轻松学习C#的正则表达式

    轻松学习C#的正则表达式

    轻松学习C#的正则表达式,对C#的正则表达式感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的正则表达式
    2015-11-11
  • C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    这篇文章主要介绍了C#中Decimal类型截取保留N位小数并且不进行四舍五入操作,本文给出需求说明和实现代码,需要的朋友可以参考下
    2015-06-06

最新评论