C#获取图片的后缀名解析

 更新时间:2014年02月18日 16:27:22   作者:  
这篇文章主要介绍了C#获取图片的后缀名解析,需要的朋友可以参考下

要说,这也是一个很简单的功能,没必要开一篇博客这么大动干戈。 对于一张知道全路径的照片,如果其路径包含后缀名的话,要取得后缀名,只需要一行代码即可:

复制代码 代码如下:

var ext = System.IO.Path.GetExtension("C:\\soar.jpg");

可是,如果这个文件的文件名不包含后缀怎么办? 在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);
}

相关文章

  • C#和lua相互调用的方法教程

    C#和lua相互调用的方法教程

    lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,所以这篇文章主要给大家介绍了关于C#和lua相互调用的方法教程,需要的朋友可以参考下。
    2017-11-11
  • C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等)

    C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等)

    这篇文章主要介绍了C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等),本文收集整理了多个扩展函数,简单实用,项目必备,如值范围、在里面吗、是null或""?、是零?等等,需要的朋友可以参考下
    2015-06-06
  • C# Soap调用WebService的实例

    C# Soap调用WebService的实例

    下面小编就为大家带来一篇C# Soap调WebService的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Revit API取得变量的内参名称实例代码

    Revit API取得变量的内参名称实例代码

    这篇文章介绍了Revit API取得变量的内参名称实例代码,有需要的朋友可以参考一下
    2013-11-11
  • Unity3D实现飞机大战游戏(2)

    Unity3D实现飞机大战游戏(2)

    这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏的第二部分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C#精确计算年龄的方法分析

    C#精确计算年龄的方法分析

    这篇文章主要介绍了C#精确计算年龄的方法,实例分析了C#计算时间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#数据库操作之LINQ to SQL技术详解

    C#数据库操作之LINQ to SQL技术详解

    本文详细介绍了LINQtoSQL技术,包括其基本概念、使用方法、动态创建数据库、插入数据、查询数据、更新数据和删除数据等操作
    2024-12-12
  • C#中SQL Command的基本用法

    C#中SQL Command的基本用法

    今天小编就为大家分享一篇关于C#中SQL Command的基本用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 轻松学习C#的异常处理

    轻松学习C#的异常处理

    轻松学习C#的异常处理,对C#的异常处理感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的异常处理
    2015-11-11
  • c# 日历控件的实现

    c# 日历控件的实现

    这篇文章主要介绍了c# 实现日历的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12

最新评论