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

public void FindExifinfo(string filePath)

        {

            Image img = Image.FromFile(filePath);

            PropertyItem[] pt = img.PropertyItems;

            for (int i = ; i < pt.Length; i++)

            {

                PropertyItem p = pt[i];            

                switch (pt[i].Id)

{  // 设备制造商 20. 

                    case 0x010F:

                        this.textBox1.Text = System.Text.ASCIIEncoding.ASCII.GetString(pt[i].Value);

                        break;           

                   case 0x0110: // 设备型号 25. 

                        this.textBox4.Text = GetValueOfType2(p.Value);

                        break;

                    case 0x0132: // 拍照时间 30.

                        this.textBox2.Text = GetValueOfType2(p.Value);

                        break;         

                    case 0x829A: // .曝光时间 

    this.textBox3.Text = GetValueOfType5(p.Value)+" sec";

                        break;

                    case 0x8827: // ISO 40.  

                        this.textBox5.Text = GetValueOfType3(p.Value);

                        break;

                    case 0x010E: // 图像说明info.description

                        this.textBox6.Text = GetValueOfType2(p.Value);

                        break;

                    case 0x920a: //相片的焦距

                        this.textBox7.Text = GetValueOfType5A(p.Value) + " mm";

                        break;

                    case 0x829D: //相片的光圈值

                        this.textBox8.Text = GetValueOfType5A(p.Value);

                        break;

                    default:

                        break;

}

      }

}

public string GetValueOfType2(byte[] b)// 对type=2 的value值进行读取
{
return System.Text.Encoding.ASCII.GetString(b);
}
private static string GetValueOfType3(byte[] b) //对type=3 的value值进行读取
{
if (b.Length != ) return "unknow";
return Convert.ToUInt16(b[] << | b[]).ToString();
}
private static string GetValueOfType5(byte[] b) //对type=5 的value值进行读取
{
if (b.Length != ) return "unknow";
UInt32 fm, fz;
fm = ;
fz = ;
fz = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
fm = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
return fm.ToString() + "/" + fz.ToString()+" sec";
}
private static string GetValueOfType5A(byte[] b)//获取光圈的值
{
if (b.Length != ) return "unknow";
UInt32 fm, fz;
fm = ;
fz = ;
fz = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
fm = Convert.ToUInt32(b[] << | b[] << | b[] << | b[]);
double temp = (double)fm / fz;
return (temp).ToString();
}

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. dwr与ssh框架整合教程

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...

  2. 学习练习 java面向对象梯形面积

    package com.hanqi; public class Ladder { double ShangDi; double XiaDi; double Gao; double MianJi; La ...

  3. CSS常用布局整理(二)

    1-2-1单列变宽布局 side列定宽300px,content列变宽,尺寸是100%-300px.核心的问题就是浮动列的宽度应该等于“100% - 300px”,而CSS显然不支持这种带有减法运算的 ...

  4. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...

  5. JS基础学习1——什么是基础js类和原型?

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. POJ C++程序设计 编程作业—类和对象 编程题 #2

    编程题 #2 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序的输出 ...

  7. iOS中UIKit——UIDataDetectors(数据检测器)它将电话、邮件、网址等变为链接

    1.它用于UITextView和UIWebView,属性名为:dataDetetorTypes 2.此属性可以设定使符合电话.邮件.网址.符合格式的日期等文字变为链接文字. 3.电话号码点击后拨出电话 ...

  8. 自定义控件winfrom

    附件代码:http://files.cnblogs.com/files/qtiger/CompositeControl.zip 转载:http://www.cnblogs.com/bomo/archi ...

  9. Oozie和Azkaban的技术选型和对比

    1 两种调度工具功能对比图 下面的表格对上述2种hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在区别 特性 ...

  10. 往Android SDCard中读写入数据

    一.用Environment (写) 1.API获取sdcard的路径 File path=Environment.getExternalStorageDirectory(); path=new Fi ...