使用C#判斷文件是否為圖片的多種方法
0、常見的判斷圖片文件的方法
判斷文件是否為圖片的方式主要有三種:
- 根據(jù)文件擴(kuò)展名判斷
- 通過(guò)文件頭(Magic Number)判斷
- 嘗試加載文件判斷(推薦:使用 ImageSharp)
1. 根據(jù)文件擴(kuò)展名判斷
這是最簡(jiǎn)單的方式,通過(guò)判斷文件的擴(kuò)展名來(lái)判斷是否是圖片。雖然實(shí)現(xiàn)簡(jiǎn)單,但不夠嚴(yán)謹(jǐn),因?yàn)槲募U(kuò)展名可以被偽造。
代碼示例
public bool IsImageByExtension(string filePath)
{
// 支持的圖片格式擴(kuò)展名
string[] validExtensions = { ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp" };
string extension = Path.GetExtension(filePath)?.ToLower(); // 獲取文件擴(kuò)展名并轉(zhuǎn)為小寫
return validExtensions.Contains(extension);
}優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,性能高。
- 缺點(diǎn):無(wú)法保證文件內(nèi)容確實(shí)是圖片,可能會(huì)被偽造。
2. 通過(guò)文件頭(Magic Number)判斷
每種文件格式都有獨(dú)特的二進(jìn)制頭部(Magic Number)。通過(guò)讀取文件的前幾個(gè)字節(jié)并與常見圖片格式的 Magic Number 進(jìn)行匹配,可以更準(zhǔn)確地判斷文件類型。
代碼示例
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個(gè)字節(jié)
fs.Read(buffer, 0, buffer.Length);
// 判斷文件頭是否匹配某個(gè)圖片格式
foreach (var header in imageHeaders.Values)
{
if (buffer.Take(header.Length).SequenceEqual(header))
return true;
}
}
return false;
}優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):更可靠,確保文件頭與圖片格式匹配。
- 缺點(diǎn):需要解析文件內(nèi)容,稍微占用資源。
3. 使用 ImageSharp 判斷文件是否為圖片
隨著 .NET 6 及以上版本中 System.Drawing 被棄用,推薦使用 SixLabors.ImageSharp 庫(kù)來(lái)判斷文件是否為圖片。ImageSharp 是一個(gè)跨平臺(tái)的圖像處理庫(kù),支持多種圖片格式,并能確保文件不僅是圖片擴(kuò)展名匹配,還確實(shí)能被解析為圖片格式。
安裝 ImageSharp
使用以下命令安裝 ImageSharp:
dotnet add package SixLabors.ImageSharp
或者在項(xiàng)目的 .csproj 文件中添加:
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
代碼示例:使用 ImageSharp 檢測(cè)文件類型
using SixLabors.ImageSharp;
public bool IsImageByImageSharp(string filePath)
{
try
{
// 使用 Image.Load 檢測(cè)文件是否為有效圖片
using (var image = Image.Load(filePath))
{
return true;
}
}
catch (SixLabors.ImageSharp.UnknownImageFormatException)
{
// 格式不支持或不是圖片
return false;
}
catch (Exception)
{
// 其他異常,如文件不存在等
return false;
}
}代碼解析
Image.Load:如果文件是支持的圖片格式,會(huì)成功加載,否則拋出異常。UnknownImageFormatException:當(dāng)文件不是圖片或格式不支持時(shí)拋出此異常。- 其他異常:捕獲如文件路徑錯(cuò)誤等情況,避免程序崩潰。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):嚴(yán)謹(jǐn)可靠,確保文件內(nèi)容確實(shí)是圖片格式。
- 缺點(diǎn):加載文件時(shí)會(huì)稍占用資源。
支持的圖片格式
ImageSharp 支持常見的圖片格式:
ImageSharp 支持常見的圖片格式:
- JPEG (
.jpg,.jpeg) - PNG (
.png) - GIF (
.gif) - BMP (
.bmp) - TIFF (
.tiff) - WEBP (
.webp)
4、總結(jié)
以上就是使用C#判斷文件是否為圖片的多種方法的詳細(xì)內(nèi)容,更多關(guān)于C#判斷文件是否為圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#結(jié)合AForge實(shí)現(xiàn)攝像頭錄像
最近由于興趣學(xué)習(xí)了下在C#上使用AForge錄制攝像頭視頻并壓縮編碼??傮w上來(lái)說(shuō)這個(gè)第三方.net視覺開發(fā)庫(kù)還是比較穩(wěn)定的2017-09-09
WinForm實(shí)現(xiàn)基于BindingSource的方法擴(kuò)展
這篇文章主要介紹了WinForm實(shí)現(xiàn)基于BindingSource的方法擴(kuò)展,需要的朋友可以參考下2014-08-08
Winform使用DataGridView實(shí)現(xiàn)下拉篩選
這篇文章主要為大家詳細(xì)介紹了Winform如何使用原生DataGridView實(shí)現(xiàn)下拉篩選功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09
C#使用ODBC與OLEDB連接數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了C#使用ODBC與OLEDB連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了C#基于ODBC與OLEDB實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接操作簡(jiǎn)單操作技巧,需要的朋友可以參考下2017-05-05
C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(三)
這篇文章主要介紹了C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(三),本文講解了在C++中允許從一個(gè)case貫穿到另一個(gè)case標(biāo)簽、as和is只會(huì)檢測(cè)待轉(zhuǎn)化類型的類型,而不會(huì)進(jìn)行其它操作等內(nèi)容,需要的朋友可以參考下2015-04-04
C#使用Twain協(xié)議開發(fā)一個(gè)高掃儀對(duì)接功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用Twain協(xié)議開發(fā)一個(gè)高掃儀對(duì)接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

