最近在学习过程中遇到一个问题,就是如何获取图片的格式,对于一张知道全路径的照片,如果其路径包含后缀名的话,要取得后缀名,只需要一行代码即可:

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 = ; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

本文章主要转载http://developer.zdnet.com.cn/2014/0218/3011554.shtml

C#获取图片的后缀名的更多相关文章

  1. layui图片上传之后后台如何修改图片的后缀名以及返回数据给前台

    const pathLib = require('path');//引入node.js下的一个path模块的方法,主要处理文件的名字等工作,具体可看文档 const fs = require(''fs ...

  2. Java获取文件的后缀名。

    /** * 详细步骤 */ private static void test1() { //获取文件的原始名称 String originalFilename = "tim.g (1).jp ...

  3. FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...

  4. 用endsWith()来限制图片的后缀名

    var a=document.getElementById('file-name'); var filename=a.value if(!a.endsWith('.jpg')||!a.endsWith ...

  5. JS 根据文件路径获取名字和后缀名

    var fileName = this.from.doc.substring(this.from.doc.lastIndexOf('/')+1); //文件名           var extNam ...

  6. php获取文件名和后缀名

    php获取文件名 1 function retrieve($url) 2 { 3 preg_match('/\/([^\/]+\.[a-z]+)[^\/]*$/',$url,$match); 4 re ...

  7. Shell 字符串处理、获取文件名和后缀名

    http://blog.csdn.net/guojin08/article/details/38704823

  8. 获取文件的后缀名。phpinfo

    1: function get_extension($file){ //strrchr 返回 .jpg substr :1 是从1开始. substr(strrchr($file,'.'),1) } ...

  9. JavaScript 获取文件名,后缀名

    function getBaseName(str) { var segs = str.split('.'); if(segs.length > 1) segs.pop(); return seg ...

随机推荐

  1. SQL Server 使用全文索引进行页面搜索

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/全文索引 概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询.全文索引将有关重要的词及其位置的信息存储 ...

  2. SQL Server 系统数据库恢复

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/故障恢复/master 概述 SQL Server 维护一组系统级数据库(称为“系统数据库”),这些数据库对于服务器实例的运行至关 ...

  3. C# 6.0 功能预览 (二)

    在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 Roslyn 编译平台 ...

  4. TODO:Golang Linux进程退出说明

    TODO:Golang Linux进程退出说明 Golang使用os.Exit(code)进程退出导致当前程序退出并返回给定的状态代码.传统上,code代码为零表示成功退出,非零错误退出. sysca ...

  5. How To Install Proxmox Nested on VMware ESXi (Full Support OpenVZ & KVM)

    https://imanudin.net/2015/03/04/how-to-install-proxmox-nested-on-vmware-esxi-full-support-openvz-kvm ...

  6. The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'

    今天查看Job的History,发现Job 运行失败,错误信息是:“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRA ...

  7. LINQ系列:Linq to Object量词操作符

    量词操作符返回一个Boolean值,指示序列中是否存在部分或全部元素符号指定条件.LINQ中量词操作符包括:All.Any和Contains. 1. All All操作符判定在集合中是否所有的值都满足 ...

  8. UDP(强行关闭了一个现有的连接远程主机)

    事件回顾:客户端连接服务器 ,一段时间后会发生服务器“挂掉”的情况,为了找到原因,在调试模式下运行服务器,捕捉到了一下异常: 红色框出来的即为异常原因:强行关闭了一个现有的连接远程主机 然后就发生了可 ...

  9. OpenCASCADE BRep vs. OpenNURBS BRep

    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...

  10. .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建

    闲来没事做,还是想再学习一门新的技术,无论何时Android开发比Web的开发工资应该高40%,我也建议大家面对移动开发,我比较喜欢学习最新版本的,我有java的基础,但是年久,已经淡忘,以零基础学习 ...