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

在开发中,我们常需要判断一个文件是否为图片。这看似简单,但要实现得既高效又严谨,需要根据不同场景选择合适的方法。本文记录了几种常见的判断方式,并推荐使用 SixLabors.ImageSharp 来替代已被淘汰的 System.Drawing

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

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

  1. 根据文件扩展名判断
  2. 通过文件头(Magic Number)判断
  3. 尝试加载文件判断(推荐:使用 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 Numbervar 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;}
}
代码解析
  1. Image.Load:如果文件是支持的图片格式,会成功加载,否则抛出异常。
  2. UnknownImageFormatException:当文件不是图片或格式不支持时抛出此异常。
  3. 其他异常:捕获如文件路径错误等情况,避免程序崩溃。
优缺点
  • 优点:严谨可靠,确保文件内容确实是图片格式。
  • 缺点:加载文件时会稍占用资源。

支持的图片格式

ImageSharp 支持常见的图片格式:

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

四、总结

判断一个文件是否为图片有多种实现方式。

  1. 基于扩展名的判断 适用于简单快速的检查,但不够严谨。
  2. 基于文件头(Magic Number)的判断 更加可靠,可以避免文件扩展名被伪造的情况。
  3. 使用 ImageSharp 加载图片的判断 是最严谨的方式,推荐在生产环境中使用。

根据不同场景,可以选择合适的判断方式。如果需要高可靠性,推荐使用 SixLabors.ImageSharp 来确保文件不仅是图片格式,而且能被正常解析。


通过以上多种方法的结合,可以在开发中根据需求灵活选择,并确保判断的准确性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03 springboot-国际化

Spring Boot 提供了很好的国际化支持&#xff0c;可以轻松地实现中英文国际化。 项目创建&#xff0c;及其springboot系列相关知识点详见&#xff1a;springboot系列 springboot系列&#xff0c;最近持续更新中&#xff0c;如需要请关注 如果你觉得我分享的内容或者我的努力对…

2024年软件设计师中级(软考中级)详细笔记【11】知识产权基础知识(分值2~3分)

目录 前言第11章 知识产权基础知识【2-3分】11.1 标准化基础知识11.2 知识产权基础知识11.2.2 计算机软件著作权11.2.3 计算机软件的商业秘密权11.2.4 专利权概述习题 结语 前言 在备考软件设计师中级考试的过程中&#xff0c;我遇到了些许挑战&#xff0c;也收获了宝贵的经验…

基于django的个人相册日记管理系统

你是否还在为毕业设计苦思冥想&#xff0c;不知道怎么选择一个合适又实用的技术项目&#xff1f;今天给大家介绍一款功能全面的Django项目——个人相册日记管理系统&#xff0c;堪称毕业设计的完美选择&#xff01; 首先&#xff0c;这不是简单的相册或日记本&#xff0c;而是…

苍穹外卖05

redis 1. 启动redis .\redis-server.exe redis.windows.conf 2. 连接redis到客户端(这里我们使用ARDM图形化工具) 新建连接 一旦建立好后就永久直接可用(和mysql一个道理) 连接成功界面

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急&#xff0c;说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复&#xff0c;当然需要一定的条件&#xff1a;首先mysql开启binlog&#xff0c;然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…

vim的使用方法

常见的命令可参考&#xff1a; Linux vi/vim | 菜鸟教程​www.runoob.com/linux/linux-vim.html​编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式&#xff0c;命令模式、编辑输入模式和末行&am…

高薪、高含金量、高性价比的“三高”证书——PMP证书

24年感觉什么都不好做&#xff0c;经济大环境也不太好&#xff0c;工作也卷&#xff0c;裁员降薪&#xff0c;为什么有的人没有危机&#xff0c;不降反增了呢&#xff1f;古语云往往越是危机的时候&#xff0c;越是机会多的时候&#xff0c;今天分享一个高薪、高含金量、高性 如…

关于写“查看IT设备详细信息”接口的理解

这两个星期一直在做关于IT资产管理相关的内容。这个内容大概就建立三张表&#xff0c;然后对三张表进行操作。一般情况下&#xff0c;对一张表也就那么几种操作&#xff1a;增删改查&#xff0c;导入导出。这里我说了6个操作&#xff0c;那就代表要写6个接口。这6个接口就是最常…

[Linux关键词]内建命令

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Qt 二进制文件的读写

Qt 二进制文件的读写 开发工具&#xff1a;VS2013 QT5.8.0 实例功能概述 1、新建项目“sample7_2binFile” 完成以上步骤后&#xff0c;生成以下文件&#xff1a; 2、界面设计 如何添加资源文件&#xff1a; 鼠标双击“***.qrc”文件 弹出以下界面&#xff1a; 点击 “Add F…

【AI视频抠图整合包及教程】开启视觉分割新纪元 —— Meta SAM 2

在数字化时代&#xff0c;Meta公司推出的SAM 2&#xff08;Segment Anything Model 2&#xff09;标志着图像和视频分割技术的一个新高度。SAM 2不仅继承了前代SAM模型的卓越性能&#xff0c;更在实时处理、视频分割、交互式提示等方面实现了重大突破。以下是SAM 2的全面营销文…

075_基于springboot的万里学院摄影社团管理系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…

[分享] SQL在线编辑工具(好用)

在线SQL编写工具&#xff08;无广告&#xff09; - 在线SQL编写工具 - Web SQL - SQL在线编辑格式化 - WGCLOUD

AI修图太牛了! | 换模特、换服装、换背景都如此简单!

前言 推荐一款我最近发现的AI工具&#xff0c;它就是最懂电商的千鹿AI&#xff0c;专门用来做电商产品图、场景图的&#xff0c;除此外还有AI修图、线稿上色、批量抠图等等超多图片处理工具。 本人也从事过电商行业&#xff0c;包括跨境电商&#xff0c;非常知道电商人的疾苦…

Java 多线程(七)—— 定时器

定时器介绍与使用 先简单介绍一下什么是定时器&#xff1a;定时器类似生活中的闹钟&#xff0c;当时间一到&#xff0c;我们就会去做某些事情。 在代码层面理解就是&#xff0c;当我们设置的时间一到&#xff0c;程序就会执行我们固定的代码片段&#xff08;也就是任务&#x…

谷歌新安装包文件形式 .aab 在UE4中的打包原理

摘要 本文学习了aab的基本概念以及UE4中产生aab的构建原理。 从官网了解基本概念 官网&#xff1a;Android Developers 1、什么是aab&#xff1f; .aab包形如&#xff1a; 2021年7月&#xff0c;在Google Play应用程序中&#xff0c;已经有数千个应用程序率先跟进了AAB格式。…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 K-最近邻&#xff08;K-nearest neighbours, KNN&#xff09;基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…