c#獲取圖片正確格式的方法
大部分時候,我們可以通過從圖片路徑中截取擴(kuò)展名的方式拿到一個圖片的格式:
var ext = Path.GetExtension("C:\\coderbusy.jpg");
Console.WriteLine(ext);
這將會顯示出:
jpg
但是如果我們拿到的只是數(shù)據(jù)流或者是路徑名不被信任的場景(比如擴(kuò)展名是隨機(jī)字符串的臨時文件)那么我們可能就需要從文件內(nèi)容反推文件格式。
幸運(yùn)的是:.NET 為我們提供了 Image 類型用于表示一個圖片。Image 類型包含一個類型為 ImageFormat 的 RawFormat 屬性,通過它我們可以準(zhǔn)確的拿到圖片的格式。如果我們直接調(diào)用 RawFormat 屬性的 ToString 方法,就能拿到圖片的原始格式:
var img = Image.FromFile(@"D:\coderbusy.jpg"); Console.WriteLine(img.RawFormat.ToString());
這將會顯示出:
Jpeg
不幸的是,在使用 .NET Framework 2 版本時,ImageFormat 的 ToString 方法實現(xiàn)有誤,這導(dǎo)致同樣的代碼在 .NET Framework 2 下的輸出是這個樣子的:
[ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]
為了做到代碼全平臺通用,筆者封裝了 ImageHelper 類型,該類型包含一個 GetExtension 方法。通過調(diào)用該方法可以準(zhǔn)確的獲取到圖片的原始格式:
public static class ImageHelper
{
static ImageHelper()
{
lock (typeof(ImageHelper))
{
_mapping = GetImageFormatMapping();
}
}
private static IDictionary<Guid, String> _mapping;
private static IDictionary<Guid, String> GetImageFormatMapping()
{
var dic = new Dictionary<Guid, String>();
var properties = typeof(ImageFormat).GetProperties(
BindingFlags.Static | BindingFlags.Public
);
foreach (var property in properties)
{
var format = property.GetValue(null, null) as ImageFormat;
if (format == null) continue;
dic[format.Guid] = "." + property.Name.ToLower();
}
return dic;
}
public static String GetExtension(Image image)
{
var format = image.RawFormat;
if (_mapping.ContainsKey(format.Guid))
{
return _mapping[format.Guid];
}
return String.Empty;
}
}
以上代碼在 ImageHelper 的靜態(tài)構(gòu)造函數(shù)中反射獲取了 ImageFormat 類型的所有靜態(tài)字段,并將字段的 Guid 值與字段名稱做了一個映射。當(dāng)我們需要獲取某個圖片的格式時,先通過 RawForamt 屬性獲得 Guid ,之后查表給出對應(yīng)的格式。
調(diào)用方式如下:
var img = Image.FromFile(@"D:\coderbusy.jpg"); var ext = ImageHelper.GetExtension(img); Console.WriteLine(ext);
以上就是c#獲取圖片正確格式的方法的詳細(xì)內(nèi)容,更多關(guān)于C#獲取圖片格式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
DirectoryEntry配置IIS7出現(xiàn)ADSI Error:未知錯誤(0x80005000)
這篇文章主要介紹了DirectoryEntry配置IIS7出現(xiàn)ADSI Error:未知錯誤(0x80005000)的解決辦法2015-09-09
C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)
這篇文章主要介紹了C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟
工作所需,需要截圖軟件跑出來的界面上的圖表,但是窗口本身是可以縮放的,圖表也是做的可以跟著窗體大小一起縮放,所以就寫了一個函數(shù),用于截圖圖表容器內(nèi)的圖像,文中有函數(shù)源碼供大家參考,需要的朋友可以參考下2024-10-10
C#使用OleDb操作Excel和數(shù)據(jù)庫的策略
在C#編程中,使用OleDb可以方便地實現(xiàn)對Excel文件和數(shù)據(jù)庫的操作,本文探討了在C#中使用OleDb技術(shù)操作Excel和數(shù)據(jù)庫的策略,文章詳述了OleDb的定義、配置環(huán)境的步驟,并通過實際代碼示例演示了如何高效讀寫Excel文件和交互數(shù)據(jù)庫,需要的朋友可以參考下2024-05-05

