简介

想要获取图片的信息,例如快门速度、ISO值等等,我们可以通过读取Exif中存储的信息。Exif(Exchangeable Image File)是存储在JPEG格式照片头部的一段信息,相机和手机拍摄的照片都会携带这些信息,但是需要注意,PS的照片的时候采用低质量保存会丢失这些信息。在PS中保存为10-12等级的时候不会丢失,在美图秀秀中保存质量为100%不会丢失。软件在处理的时候也会将自己的信息写入Exif,所以也可以通过这种方式判断是否为原图,或者图片是否经过处理。

本文中我介绍两种方式获取Exif。一是C#自带的Image.PropertyItems 属性(了解),二是通过第三方控件metadata-extractor获取(推荐)。

一、通过Image.PropertyItems 属性获取照片信息

Image.PropertyItems 属性中有几个重要属性,Id:为int型,不同的Id表示不同的参数的;Value:表示参数的值,byte[]型;Len:为int型,表示Value的长度,以字节为单位;Type:short型,表示Value的取数方法。Type主要有以下几个类型:

type=1 时 Value 为字节数组。

type=2 时 Value 为空终止 ASCII 字符串。如果将类型数据成员设置为 ASCII 类型,则应该将 Len 属性设置为包括空终止的字符串长度。例如,字符串“Hello”的长度为 6

type=3 时 Value 为无符号的短(16 位)整型数组。

type=4 时 Value 为无符号的长(32 位)整型数组。

type=5 时 Value 数据成员为无符号的长整型对数组。每一对都表示一个分数;第一个整数是分子,第二个整数是分母。

type=6 时 Value 为可以包含任何数据类型的值的字节数组。

type=7 时 Value 为有符号的长(32 位)整型数组。

type=10 时 Value 为有符号的长整型对数组。每一对都表示一个分数;第一个整数是分子,第二个整数是分母。

参考文献:http://blog.csdn.net/yang073402/article/details/5470127

在使用Image.PropertyItems属性时需要引用:using System.Drawing

下面是代码:

在调用的时候用 var piList=GetExifByPi("照片路径");这种方法需要注意以下几个方面:

注意:

1、Image.PropertyItems的Type中同一个类型有的时候不能用同一个方法得到,这是由于参数的表现方式不同,所以建议用Id,每一个ID用对应的方法将byte[]装换为string。

2、不同型号的手机和相机Exif中存储方式不一样,这一点非常重要,也就是说这个方法其实无法准确获每个图片的信息。我们需要将每种相机和手机分别用不同方法获取,这个工作量太大了,幸好有第三方插件。

二、通过metadata-extractor获取照片参数

metadata-extractor是目前最简单易用的EXIF信息处理包,是由Drew Noakes写的。官网: https://drewnoakes.com/code/exif/  官网上面的是用的.nupkg的文件,而不是传统的.dll文件,需要通过nuget引入本地。如果不会安装和使用nuget的可以参考文献:http://www.cnblogs.com/chsword/archive/2011/09/14/NuGet_Install_OperatePackage.html  成功安装nuget后再vs中点击:工具->NuGet程序包管理器->程序包管理器控制台。

然后在"pm>"处输入:Install-Package MetadataExtractor  可以参考:https://www.nuget.org/packages/MetadataExtractor/

最后将dll引用到您的项目中:

完整代码:

#region 通过metadata-extractor获取照片参数//参考文献//官网: https://drewnoakes.com/code/exif///nuget 官网:https://www.nuget.org///nuget 使用: http://www.cnblogs.com/chsword/archive/2011/09/14/NuGet_Install_OperatePackage.html//nuget MetadataExtractor: https://www.nuget.org/packages/MetadataExtractor//// <summary>通过MetadataExtractor获取照片参数/// </summary>/// <param name="imgPath">照片绝对路径</param>/// <returns></returns>public static Dictionary<string,string> GetExifByMe(string imgPath){ var rmd = ImageMetadataReader.ReadMetadata(imgPath);var rt=new Dictionary<string,string>();foreach (var rd in rmd){foreach(var tag in rd.Tags){var temp = EngToChs(tag.Name);if (temp == "其他"){continue;}if (!rt.ContainsKey(temp)){rt.Add(temp, tag.Description);}}}return rt;}/// <summary>筛选参数并将其名称转换为中文/// </summary>/// <param name="str">参数名称</param>/// <returns>参数中文名</returns>private static string EngToChs(string str){var rt = "其他";switch (str){case "Exif Version": rt = "Exif版本";break;case "Model": rt = "相机型号";break;case "Lens Model": rt = "镜头类型";break;case "File Name": rt = "文件名";break;case "File Size": rt = "文件大小";break;case "Date/Time": rt = "拍摄时间";break;case "File Modified Date": rt = "修改时间";break;case "Image Height": rt = "照片高度";break;case "Image Width": rt = "照片宽度";break;case "X Resolution": rt = "水平分辨率";break;case "Y Resolution": rt = "垂直分辨率";break;case "Color Space": rt = "色彩空间";break;case "Shutter Speed Value": rt = "快门速度";break;case "F-Number": rt = "光圈";//Aperture Value也表示光圈break;case "ISO Speed Ratings": rt = "ISO";break;case "Exposure Bias Value": rt = "曝光补偿";break;case "Focal Length": rt = "焦距";break;case "Exposure Program": rt = "曝光程序";break;case "Metering Mode": rt = "测光模式";break;case "Flash Mode": rt = "闪光灯";break;case "White Balance Mode": rt = "白平衡";break;case "Exposure Mode": rt = "曝光模式";break;case "Continuous Drive Mode": rt = "驱动模式";break;case "Focus Mode": rt = "对焦模式";break;}return rt;}#endregion

使用的时候:var me=GetExifByMe();

注意:

1、var rmd = ImageMetadataReader.ReadMetadata(imgPath);方法里可以是照片路径和Stream类型。

2、metadata-extractor会将所有信息读出来,而且还是英文的,所以要将里面的数据进行选取,需要的还要转换为中文。

参考文献:
官网: https://drewnoakes.com/code/exif/
nuget MetadataExtractor: https://www.nuget.org/packages/MetadataExtractor/
nuget 使用: http://www.cnblogs.com/chsword/archive/2011/09/14/NuGet_Install_OperatePackage.html

.net c#通过Exif获取图片信息(参数)相关推荐

  1. Exchangeable Image File (EXIF)图片信息

    目录 1. 什么是 EXIF? 2. 通过 EXIF 获取信息 2.1 EXIF 信息查看器(在线) 2.2 使用 JavaScript 获取 EXIF 2.2.1 使用 CDN 引入 exif.js ...

  2. html的子页面获取自己url,如何从html页面获取url参数并将其显示在textarea中?

    我用下面的在我的HTML页面的JavaScript功能,我想没有textarea的任何连接操作正常显示参数....如何从html页面获取url参数并将其显示在textarea中? function g ...

  3. postman发送post请求,用request.getParameter()获取请求参数

    1.接口代码 @RequestMapping("notifyUrl")   public void notifyUrl(HttpServletRequest request, Ht ...

  4. 如何在Matlab中获取函数参数的数目?

    本图文详细介绍了Matlab中获取函数参数数目的方法.

  5. php微信支付参数动态配置,支付,微信开发_微信支付动态如何获取$jsApiParameters参数,支付,微信开发 - phpStudy...

    微信支付动态如何获取$jsApiParameters参数 现在我们在做一个需要动态变换价格的微信支付页面,就是用户购买商品后,跳转到支付页面,但是可以选择几个不同的价格当中一个进行支付. 当跳到这个页 ...

  6. openresty获取请求参数

    获取url参数 ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数,例如 ?strider=1 为了获取输入参数s ...

  7. jQuery插件—获取URL参数

    做的项目中需要用到通过JS获取GET参数,上网找了一下,找到如下插件: 例如 当前你的URL是: http://www.xxx.com/index.php?test=1&kk=2 如果想获取t ...

  8. React router 4 获取路由参数,跨页面参数

    1. match通过路径 <Route path="/path/:name" component={example} /> 路由组件内获取参数使用 this.props ...

  9. 在拦截器中获取请求参数,[Ljava.lang.String; cannot be cast to java.lang.String报错

    Map<String,Object> parametersmap=invocation.getInvocationContext().getParameters();//获取请求参数    ...

  10. 使用jquery获取url以及jquery获取url参数的方法

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作1.jquery获取url很简单,代码如下1.window.location.href;其实只是用到了javascri ...

最新文章

  1. redis集群模式的工作原理
  2. mybatis-generator-gu(mybatis generator 的图形界面工具)
  3. 【光通信】用于可见光通信的OFDM发射机和接收机
  4. linux卸载数据库后还在吗,oracle停止数据库后linux完全卸载oracle的详细步骤
  5. master excel
  6. ngx_event_expire_timers
  7. 微信小程序setTimeout自动跳转页面
  8. 命令行进入指定目录_VIM学习笔记 操作目录(Manipulate Directory)
  9. debian 删除mysql数据库_Debian中完全卸载MySQL的方法
  10. symfony api 异常处理_dubbo-RPC服务的异常处理
  11. 全面的framebuffer详解一
  12. 鼎力加密狗驱动程序_怎么安装加密狗驱动程序
  13. 电压信号与电流信号的转换
  14. 家用计算机的ram怎么清理,电脑内存满了怎么清理【解决流程】
  15. android app银联支付,android app 快速接入银联支付流程(android studio版)
  16. dockerfile-maven-plugin推送镜像到远程harbor仓库出现denied: requested access to the resource is denied
  17. 冯诺依曼结构和哈弗结构
  18. 【Hack The Box】linux练习-- Ophiuchi
  19. 2ASK、2FSK、2PSK、2DPSK、4ASK、4FSK、4PSK、4DPSK、QPSK,以及4QAM、16QAM和MSK、GMSK这些调制和解调过程
  20. NC | 中科院蔡磊组揭示跨界合成菌群增强番茄对镰刀枯萎病抗病能力

热门文章

  1. 计算机wifi共享怎么设置,电脑怎么共享wifi热点 电脑设置wifi热点教程
  2. 解决“为了对电脑进行保护,已经阻止此应用”问题
  3. Roadrunner安装与简单使用
  4. SameSite Cookie
  5. matlab画基尼系数,matlab 拟合洛伦兹曲线求基尼系数
  6. 酷我音乐解析API,支持搜索、歌单、单曲、专辑、MV解析、多音质切换、图片大小切换
  7. fmpeg分析视频gop的大小
  8. 一篇文章理清产品、运营、营销之间的概念和关系
  9. 基于Cocos2d-x实现的畜不及防鬼畜音乐节奏游戏
  10. python摄像头人脸识别代码_Python3利用Dlib19.7实现摄像头人脸识别的方法