C#获取图片的后缀名
最近在學習過程中遇到一個問題,就是如何獲取圖片的格式,對于一張知道全路徑的照片,如果其路徑包含后綴名的話,要取得后綴名,只需要一行代碼即可:
var ext = System.IO.Path.GetExtension("C:\Users\wustczx\Pictures\PICTURE\1081324_133320158149_2.ico");
可是,如果這個文件的文件名不包含后綴呢? 在C#中并沒有提供直接獲取圖片格式的方法,想根據圖片(也就是Image對象)獲取圖片格式,首先我們可以在`Image`對象中看到一個類型為`ImageFormat`的`RawFormat`屬性。但是,通過這個屬性,我們只能取到這個圖片格式的Guid,而無法取到具體的名稱。不過,在`ImageFormat`類中采用靜態屬性的方式羅列了幾個常用的圖片格式,有了這些,我們就可以通過"一一對照"的方式來拿到一張圖片具體的后綴名了。 首先,我們需要得到在`ImageFormat`中羅列出來的圖片格式,我們采用反射取值。
private static Dictionary<String, ImageFormat> GetImageFormats()
{
var dic = new Dictionary<String, ImageFormat>();
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.Add(("." + property.Name).ToLower(), format);
}
return dic;
}
通過上面的代碼,我們就能取到"圖片后綴"和ImageFormat實例的對應關系。需要注意的是,對于jpg格式,這里取到的是jpeg.反射的效率很低,所以我們需要將產生的結果緩存起來。
private static Dictionary<String, ImageFormat> _imageFormats;
/// <summary>
/// 獲取 所有支持的圖片格式字典
/// </summary>
public static Dictionary<String, ImageFormat> ImageFormats
{
get
{
return _imageFormats ?? (_imageFormats = GetImageFormats());
}
}
采用按需加載,減少啟動時間。不過,如果你是多線程環境,最好能夠加個鎖。剩下的事情就好辦了,循環這個字典,對比字典值的Guid,返回字典的鍵就可以/// <summary>
/// 根據圖像獲取圖像的擴展名
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static String GetExtension(Image image)
{
foreach (var pair in ImageFormats)
{
if (pair.Value.Guid == image.RawFormat.Guid)
{
return pair.Key;
}
}
throw new BadImageFormatException();
}
使用方法:
using (var img = Image.FromFile(@"C:soar"))
{
var ext = GetExtension(img);
}
另外,是根據圖像數據來解析類型,這樣更準確些,具體看代碼如下:
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
本文章主要轉載http://developer.zdnet.com.cn/2014/0218/3011554.shtml
總結
以上是生活随笔為你收集整理的C#获取图片的后缀名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不要重复 DAO!
- 下一篇: 支付宝蚂蚁森林花棒怎么种 蚂蚁森林花棒种