1. 程式人生 > 程式設計 >c#獲取圖片正確格式的方法

c#獲取圖片正確格式的方法

大部分時候,我們可以通過從圖片路徑中擷取副檔名的方式拿到一個圖片的格式:

var ext = Path.GetExtension("C:\\coderbusy.jpg");
Console.WriteLine(ext);

這將會顯示出:

jpg

但是如果我們拿到的只是資料流或者是路徑名不被信任的場景(比如副檔名是隨機字串的臨時檔案)那麼我們可能就需要從檔案內容反推檔案格式。

幸運的是:.NET 為我們提供了 Image 型別用於表示一個圖片。Image 型別包含一個型別為 ImageFormat 的 RawFormat 屬性,通過它我們可以準確的拿到圖片的格式。如果我們直接呼叫 RawFormat 屬性的 ToString 方法,就能拿到圖片的原始格式:

var img = Image.FromFile(@"D:\coderbusy.jpg");
Console.WriteLine(img.RawFormat.ToString());

這將會顯示出:

Jpeg

不幸的是,在使用 .NET Framework 2 版本時,ImageFormat 的 ToString 方法實現有誤,這導致同樣的程式碼在 .NET Framework 2 下的輸出是這個樣子的:

[ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]

為了做到程式碼全平臺通用,筆者封裝了 ImageHelper 型別,該型別包含一個 GetExtension 方法。通過呼叫該方法可以準確的獲取到圖片的原始格式:

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 的靜態建構函式中反射獲取了 ImageFormat 型別的所有靜態欄位,並將欄位的 Guid 值與欄位名稱做了一個對映。當我們需要獲取某個圖片的格式時,先通過 RawForamt 屬性獲得 Guid ,之後查表給出對應的格式。

呼叫方式如下:

var img = Image.FromFile(@"D:\coderbusy.jpg");
var ext = ImageHelper.GetExtension(img);
Console.WriteLine(ext);

以上就是c#獲取圖片正確格式的方法的詳細內容,更多關於C#獲取圖片格式的資料請關注我們其它相關文章!