现在的数码相机拍摄出来的照片表面上看都是很普通的JPEG的图片,但通常还包含着诸如相片拍摄时使用的相机生产商、型号、光圈值、快门速度等各类附加信息,这就是所谓的Exif信息。Exif是一种图像文件格式,只是文件的后缀名还是沿用大家熟悉的jpg而已。掌握Exif信息对学习提高摄影技术很有帮助。

C#.NET作为一种现代的全能开发语言,对EXIF也有着较好的支持。在.NET中,我们可以用PropertyItem对象来获取EXIF。

取得PropertyItem很简单。

Image img = Image.FromFile("支持Exif的图片文件");           
PropertyItem[] pt = img.PropertyItems;

这样就可以了,Exif信息都已载入到PropertyItem数组中了。

其中PropertyItem的ID,Type,Value属性是最重要的。

ID可以唯一表明当前PropertyItem的含义。比如,0x010F代表相机制造商,0x8827代表ISO速度,0x829D代表相机F值。这在MSDN中有非常详尽的介绍。我们首先需要花一定的精力将这些数字翻译成人类可理解的自然语言。这个实现起来很简单但是很无聊,做成HashTable或自己写一堆case都可以,看个人喜欢吧。

Value永远都是字节数组,但具体内容的取值方法随Type不同而不同。

Type是个整数,表示的类型在MSDN中是这么描述的:
 
1 指定 Value 为字节数组。
 
2 指定 Value 为空终止 ASCII 字符串。如果将类型数据成员设置为 ASCII 类型,则应该将 Len 属性设置为包括空终止的字符串长度。例如,字符串“Hello”的长度为 6。
 
3 指定 Value 为无符号的短(16 位)整型数组。
 
4 指定 Value 为无符号的长(32 位)整型数组。
 
5 指定 Value 数据成员为无符号的长整型对数组。每一对都表示一个分数;第一个整数是分子,第二个整数是分母。
 
6 指定 Value 为可以包含任何数据类型的值的字节数组。
 
7 指定 Value 为有符号的长(32 位)整型数组。
 
10 指定 Value 为有符号的长整型对数组。每一对都表示一个分数;第一个整数是分子,第二个整数是分母。

所以取Exif的算法重点在于如何根据Type值将Value字节数组变成人类可以理解的值。

获取每一条Exif信息算法的框架大概是这样的:
foreach (PropertyItem p in pt)
{
 switch(p.Type)
 { 
  case 1:
   CurrentExifDetail = GetValueOfType1(byte[] b);
   break;
  case 2:
   CurrentExifDetail = GetValueOfType2(byte[] b);
   break;
  ...
 }

CurrentExifInfo = 翻译ID到人类可读文字(p.ID.ToString()) + ":" + CurrentExifDetail;
}

举个实际例子来看看。比如,当我们扫描PropertyItem到D == 0x0110,发现其Type = 2,说明Value里的值就是C格式的普通字符数组,一个个取出来就是人类可以阅读的字符串了。

public string GetValueOfType2(byte[] b)
{
    return System.Text.Encoding.ASCII.GetString(b);
}

在接下来的文章中,我们将仔细讨论各种Type应该如何取值。

用C#读取数码相片的EXIF信息(一)相关推荐

  1. C#图片处理之: 获取数码相片的EXIF信息(二)

    还是边看个实例边聊吧,我们会讨论一些常用的ExifPropertyTagID,并了解如何得到它们的值.请牢记,MSDN是很好的资源. 随便打开张我拍的照片,按上次说的方法扫描每一个Exif属性项目. ...

  2. python读取与保存图片的exif信息

    图片的exif文件格式中保存了很多信息,比如GPS经纬度,高度,焦距等信息. 在图片的属性中可以看到这些信息: 我们可以使用python来进行exif数据的读取和保存. 1. 首先安装piexif p ...

  3. java程序中的图片与数值关联_Java从图片中读取图片的元数据Exif信息

    一般情况下是java程序读取不到gps等扩展信息的.如果想要解析到里面的信息需要下载一个jar包,metadata-extractor-2.6.4.jar(下载地址: http://code.goog ...

  4. android 读取图片信息,Android 图片Exif 信息读取和写入

    引用3rd jar来实现信息写入 下载 commons-imaging-1.0-SNAPSHOT.jar, 这个方法的好处是如果图片里面没有字段. 比如orientation 没有,但是 还可以写入. ...

  5. MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标

    前言 没有前言,创作不易,希望家人们点点赞,如有错误评论留言,感谢支持! 文章目录 前言 一.MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息 (1)前述: (2)代码实现和 ...

  6. PHP如何读取照片的exif信息

    什么是Exif? Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时 ...

  7. 基于exif信息进行图片方向旋转修正

    基于exif信息进行图片方向旋转修正 在处理标注数据的时候,发现标注框不吻合经过分析发现标注软件在读取图片时,读取了图片的exif信息,并对图片进行了旋转,所以标注的坐标时旋转后的坐标. 解决方法有两 ...

  8. 提取Exif信息中GPS经纬度,转化为double方法

    首先大致说下exif信息.感谢百度百科君~ Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白 ...

  9. 为照片加边框和EXIF信息

    [转]为照片加边框和EXIF信息 最近迷上了摄影,拍了很多照片之后就想上传跟大家分享.到色影无忌和几个摄影论坛上一看,发现很多人的照片都有不错的边框.水印和拍摄信息(相机类型.光圈.快门.拍摄日期等等 ...

最新文章

  1. mac文件夹中如何给文件重命名,快捷键是什么
  2. 微信(WeChat)电脑端多开
  3. JBookManager v1.00.2008314 (编辑管理您的Jar电子书)
  4. 安卓登录以及会话保持的解决方案
  5. (林雷看来13):功能优先,发展和重建同步,业绩后
  6. 【电路仿真】基于matlab Simulink光伏太阳能电池板仿真模型【含Matlab源码 771期】
  7. 在pcb放置坐标标注_PCB拼板上的那颗美人痣
  8. 世嘉MD游戏开发【十二】:伪3D地面,Pseudo-3D
  9. 基于air720等air7xx的4G模块luat程序下载
  10. MTK G-sensor 1
  11. Android 11 正式发布:更方便的操作和更安全的隐私
  12. 海外本地支付—Payssion
  13. C++11更新内容(2)--完美转发--默认移动构造/移动赋值--1116
  14. 截图或者模糊图片高清处理方式
  15. Latex出现错误:File ‘citesort.sty‘ not found.
  16. 什么是乙二醇二乙酸酯(EGDA)?
  17. 神经网络为什么要使用激活函数,为什么relu要比sigmoid要好
  18. crm 公户变私户的问题 班级管理 课程管理 学习记录初始化
  19. 怎么将mp4改成mp3格式?
  20. CAD快捷键_CAD常用快捷键大全

热门文章

  1. vue中的防抖函数写法
  2. 操作键盘事件源码解析(常用的鼠标事件、 键盘事件对象之keyCode属性)
  3. awt中监听输入框textField
  4. YARN组件详细介绍
  5. Linux命令解释之head
  6. C#笔记12 自定义集合和常用集合
  7. linux防火墙保存报错,29.Linux防火墙-firewalled
  8. virtualmin修改php.ini,virtualmin安装和配置使用
  9. 大数据催生智慧园区_杭州经纬智慧园区如何实现各系统间信息数据集中关联、一站管控...
  10. 如何做好大型数据中心的运维