关于 EXIF 信息的介绍。

1  EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写。EXIF是一种图像文件格式,只是文件的后缀名为jpg。EXIF信息是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在jpg文件的头部,也就是说EXIF信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。不管是硬件厂商的配套软件还是专业名门的看图工具,所有这些软件都是为了方便数码摄影者能更方便地保存查看摄影图像的重要信息。

2  如何获取EXIF信息

在.NET中,我们可以用PropertyItem对象来获取jpg 图片的EXIF信息。取得PropertyItem很简单。

Image img = Image.FromFile("支持Exif的图片文件路径");

PropertyItem[] pt = img.PropertyItems;

这样就可以了,Exif信息都已载入到PropertyItem数组中了。其中PropertyItem的ID,Type,Value属性是最重要的。

ID可以唯一表明当前PropertyItem的含义。比如,0x010F代表相机制造商,0x8827代表ISO速度,0x829D代表相机。

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字节数组变成人类可以理解的值。

  1. public void FindExifinfo(string filePath)
  2.  
  3. {
  4.  
  5. Image img = Image.FromFile(filePath);
  6.  
  7. PropertyItem[] pt = img.PropertyItems;
  8.  
  9. for (int i = ; i < pt.Length; i++)
  10.  
  11. {
  12.  
  13. PropertyItem p = pt[i];
  14.  
  15. switch (pt[i].Id)
  16.  
  17. { // 设备制造商 20.
  18.  
  19. case 0x010F:
  20.  
  21. this.textBox1.Text = System.Text.ASCIIEncoding.ASCII.GetString(pt[i].Value);
  22.  
  23. break;
  24.  
  25. case 0x0110: // 设备型号 25.
  26.  
  27. this.textBox4.Text = GetValueOfType2(p.Value);
  28.  
  29. break;
  30.  
  31. case 0x0132: // 拍照时间 30.
  32.  
  33. this.textBox2.Text = GetValueOfType2(p.Value);
  34.  
  35. break;
  36.  
  37. case 0x829A: // .曝光时间
  38.  
  39. this.textBox3.Text = GetValueOfType5(p.Value)+" sec";
  40.  
  41. break;
  42.  
  43. case 0x8827: // ISO 40.
  44.  
  45. this.textBox5.Text = GetValueOfType3(p.Value);
  46.  
  47. break;
  48.  
  49. case 0x010E: // 图像说明info.description
  50.  
  51. this.textBox6.Text = GetValueOfType2(p.Value);
  52.  
  53. break;
  54.  
  55. case 0x920a: //相片的焦距
  56.  
  57. this.textBox7.Text = GetValueOfType5A(p.Value) + " mm";
  58.  
  59. break;
  60.  
  61. case 0x829D: //相片的光圈值
  62.  
  63. this.textBox8.Text = GetValueOfType5A(p.Value);
  64.  
  65. break;
  66.  
  67. default:
  68.  
  69. break;
  70.  
  71. }
  72.  
  73. }
  74.  
  75. }
  76.  
  77. public string GetValueOfType2(byte[] b)// 对type=2 的value值进行读取
  78. {
  79. return System.Text.Encoding.ASCII.GetString(b);
  80. }
  81. private static string GetValueOfType3(byte[] b) //对type=3 的value值进行读取
  82. {
  83. if (b.Length != ) return "unknow";
  84. return Convert.ToUInt16(b[] << | b[]).ToString();
  85. }
  86. private static string GetValueOfType5(byte[] b) //对type=5 的value值进行读取
  87. {
  88. if (b.Length != ) return "unknow";
  89. UInt32 fm, fz;
  90. fm = ;
  91. fz = ;
  92. fz = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
  93. fm = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
  94. return fm.ToString() + "/" + fz.ToString()+" sec";
  95. }
  96. private static string GetValueOfType5A(byte[] b)//获取光圈的值
  97. {
  98. if (b.Length != ) return "unknow";
  99. UInt32 fm, fz;
  100. fm = ;
  101. fz = ;
  102. fz = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
  103. fm = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
  104. double temp = (double)fm / fz;
  105. return (temp).ToString();
  106. }

C# 获取图片的EXIF 信息的更多相关文章

  1. 利用php获取图片完整Exif信息类 获取图片详细完整信息类

    <?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...

  2. 获取图片的EXIF信息

    对于专业的摄影师来说,Exif信息是很重要的信息,也包含了非常多的东西 1.EXIF EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照 ...

  3. IOS: 使用imageIO获取和修改图片的exif信息

    使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...

  4. 在Android下通过ExifInterface类操作图片的Exif信息

    什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...

  5. 使用PHP获取图像文件的EXIF信息

    在我们拍的照片以及各类图像文件中,其实还保存着一些信息是无法直观看到的,比如手机拍照时会有的位置信息,图片的类型.大小等,这些信息就称为 EXIF 信息.一般 JPG . TIFF 这类的图片文件都会 ...

  6. 用C#读取图片的EXIF信息的方法

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

  7. js获取图片的EXIF,解决图片旋转问题

    相信大家在做项目的时候会遇到在canvas里加入图片时,图片发生90°,180°的旋转.当时的你肯定时懵逼的,为毛. 其实这就是图片的EXIF搞的鬼. 什么是EXIF 简单来说,Exif 信息就是由数 ...

  8. 使用Java程序读取JPG Tif等格式图片的exif信息

    package com.util; import java.io.File;import java.util.Iterator; import com.drew.imaging.ImageProces ...

  9. Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)

    Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...

随机推荐

  1. size_t 与 int 区别

    size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围, 但是如果传入的是负数,会被编译成他的补码. size_t是标准规定的一个同义词,它的原始定义放在stddef.h里面,不同的环境 ...

  2. ubuntu下,apt的参数使用,很实用呦

    ubuntu下apt-get 命令参数 常用的APT命令参数 apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版 ...

  3. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

  4. hdu2078

    刚开始看这题,感觉是DP什么的 ,后来我发现,只要找到中最小值,就可以啦,哈哈.假如用x1把0-100分割. 则0-x1-100  ===>   x1^2+(100-x1)^2 跟0-100   ...

  5. 一分钟学会(一):.NET之正则表达式

    本文介绍正则表达式在.NET中的基本应用,代码简单粗暴,实例浅显易懂,让你一分钟快速上手正则(大鸟请略过). 本文为入门文章,很多时候我们只是忘记了语法,这也可作为一个快速查询的参考. 如果想深入学习 ...

  6. [原]hdu2045 不容易系列三——LELE的RPG难题 (递推方程)

    本文出自:blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2045 题意:中文不用我说了吧. 这个题目的关键就在于 ...

  7. C puzzles详解【9-12题】

    第九题 #include <stdio.h> int main() { float f=0.0f; int i; ;i<;i++) f = f + 0.1f; if(f == 1.0 ...

  8. asp.net webuploader粘贴,拖拽,点击上传图片

    demo.html代码:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  9. Windows 和  Linux 下 禁止ping的方法

    Windows 和Linux 下 禁止ping的方法 目的: 禁止网络上的其他主机或服务器ping自己的服务器 运行环境: Windows 03.08  linux 方法: Windows 03下: ...

  10. 判断字符串是否包含字母‘k’或者‘K’

    判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...