• 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)
    {
    foreachvar pair in ImageFormats)
    {

    if (pair.Value.Guid == image.RawFormat.Guid) {
    return pair.Key; } } throw new
    BadImageFormatException(); } 使用方法: usingvar 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

  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/czx1/p/4872479.html
Copyright © 2020-2023  润新知