当前位置: 首页 > 编程日记 > 正文

C# 获取图片的EXIF 信息

关于 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 = 0; 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.descriptionthis.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 != 2) return "unknow";return Convert.ToUInt16(b[1] << 8 | b[0]).ToString();}private static string GetValueOfType5(byte[] b) //对type=5 的value值进行读取
        {if (b.Length != 8) return "unknow";UInt32 fm, fz;fm = 0;fz = 0;fz = Convert.ToUInt32(b[7] << 24 | b[6] << 16 | b[5] << 8 | b[4]);fm = Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]);return fm.ToString() + "/" + fz.ToString()+" sec";}
private static string GetValueOfType5A(byte[] b)//获取光圈的值
        {if (b.Length != 8) return "unknow";UInt32 fm, fz;fm = 0;fz = 0;fz = Convert.ToUInt32(b[7] << 24 | b[6] << 16 | b[5] << 8 | b[4]);fm = Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]);double temp = (double)fm / fz;return (temp).ToString();}

相关文章:

ffmpeg录屏/摄像头/指定窗口;别名alias设置

关于ffmpeg的使用方法很多&#xff0c;我简单写一下今天我捣鼓的几个。因为我的项目中要用到录屏和录制摄像头&#xff0c;所以试了下。网上关于录制指定窗口的方法并不多&#xff0c;我也是找了好久&#xff0c;试了好久才试出来的。 好了&#xff0c;废话不多说&#xff0c;…

黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

在编程中经常会遇到在一个按钮中执行复杂操作&#xff0c;并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡&#xff0c;当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。 …

AWS 中国宁夏和北京区正式上线 Amazon SageMaker,中国用户终于能用到新工具和功能!

2020年 5 月 12 日&#xff0c;亚马逊云服务 Amazon Web Services, Inc. (AWS) 宣布&#xff0c;Amazon SageMaker 在由西云数据运营的 AWS 中国 (宁夏) 区域和光环新网运营的 AWS 中国&#xff08;北京&#xff09;区域正式上线。 Amazon SageMaker 在中国的上线使中国用户获…

Ubuntu Vim YouCompleteMe 安装

0. 必要工具安装 sudo apt-get install build-essential cmake 1. 安装 vundle mkdir ~/.vim/bundle git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle 2.编辑 .vimrc set nocompatible " be iMproved, required filetype off …

ubuntu vsftpd虚拟用户配置/ubuntu12.04上搭建vsftpd服务示例linux

转自这里 在ubuntu中安装完vsftpd后&#xff0c;安装libdb4.6-util: 复制代码 代码示例: sudo apt-get install db4.6-util 在etc下面建立目录vsftpd, 创建一个txt文档&#xff0c;比如logins.txt&#xff0c;在其中输入用户名及密码,如: 复制代码 代码示例: test 12345…

云从完成超过18亿元新一轮融资,加快上市步伐

近日&#xff0c;云从科技完成新一轮融资&#xff0c;总规模超过18亿元人民币&#xff0c;投资方除了中国互联网投资基金、上海国盛、广州南沙金控、长三角产业创新基金等政府基金外&#xff0c;还包括工商银行、海尔金控等产业战略投资者&#xff0c;进一步强化“AI国家队”的…

input core input.c (1)

drivers/input/input.c 就是所谓的input的核心程序。 分析这个文件&#xff0c;先从input_init开始。 1: static int __init input_init(void) 2: { 3: err class_register(&input_class); 4: err input_proc_init(); 5: err register_chrdev(INPUT_MAJOR, "i…

Swift解读专题四——字符串与字符

2019独角兽企业重金招聘Python工程师标准>>> Swift解读专题四——字符串与字符 一、引言 Swift中提供了String类型与Characters类型来处理字符串和字符数据&#xff0c;Swift中的String类型除了提供了许多方便开发者使用的方法外&#xff0c;还可以与Foundation框架…

非模态对话框的销毁

前面写过一篇关于模态和非模态对话框的文章&#xff0c;关于模态对话框和非模态对话框的创建、显示&#xff0c;以及和父对话框的传值 。文章末尾我遗留了一个问题&#xff0c;即当销毁非模态对话框后&#xff0c;需要置创建该非模态对话框的指针为NULL,但是具体是怎么操作呢&a…

LAMP兄弟连PHP课程学习笔记 第二天 PHP中使用变量

2019独角兽企业重金招聘Python工程师标准>>> 一、变量的介绍 变量&#xff1a;是指临时储存值的容器&#xff0c;这个值可以是数字或者文本或者其他组合。可以在程序使用的过程中更改。 二、变量的声明 1、如果用到的数据需要多次被调用时就声明为变量&#xff0c;P…

清华孵化,打造智能驾驶感控平台,超星未来获千万A轮融资

2020年5月14日&#xff0c;智能驾驶初创企业北京超星未来科技有限公司今天宣布已完成数千万元A轮融资&#xff0c;由恒大高科技领投&#xff0c;中关村前沿基金、和米资本、宝钜投资及图灵创投进行跟投。本轮融资将帮助超星未来在人才端和研发端持续投入&#xff0c;通过软硬件…

71 mac boook pro 无 gpu 下caffe 安装

71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具&#xff0c;相当于Mac下的yum或apt ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2.安装Caffe依赖 $ brew install -vd snappy leveldb gflags glog s…

比较有趣的一个笔试题目

这2天忙于找工作&#xff0c;看.NET笔试题目的时&#xff0c;发现有些笔试题目还是比较有趣的&#xff0c;虽然考的都是基础&#xff0c;但是稍有不慎还是会进入圈套。以下面一个题目为例&#xff0c;听说是晕倒了一群人 - - classProgram { staticvoidMain(string[]…

82年 AI程序员征婚启示火了!年薪百万,女生神回复

最近在某社区&#xff0c;一则程序员征婚启示火了&#xff01;很多女生在评论区表示“全中”&#xff0c;想交流看看。然后评论区就炸了&#xff0c;有人恶意说yp&#xff0c;有人说看中了楼主的钱。笔者一翻&#xff0c;发现楼主果然无意中透露了百万年薪收入&#xff0c;虽然…

MFC给按钮添加皮肤

其实这也很简单&#xff0c;但是毕竟是因为我现在已经做出来了&#xff0c;当时还是查了一些资料的。废话不多说&#xff0c;直接上代码&#xff1a; 首先在类中声明&#xff1a; HBITMAP pausehBitmap; //用于暂停按钮的皮肤 然后将资源图片添加至资源视图中&#xff0…

Python全栈开发day2

1、python种类和区别 Cpython Python的官方版本&#xff0c;使用C语言实现&#xff0c;使用最为广泛&#xff0c;CPython实现会将源文件&#xff08;py文件&#xff09;转换成字节码文件&#xff08;pyc文件&#xff09;&#xff0c;然后运行在Python虚拟机上。 Jyhton Python的…

16分钟优化mRNA疫苗稳定性! 百度AI算法LinearDesign问世

新冠病毒全球累计确诊已超过400万人&#xff0c;疫苗是终结疫情的关键胜负手。在所有正在研发的疫苗路径中&#xff0c;研发速度更快、更具潜力的mRNA疫苗作为一种新兴技术受到了国内外的重点关注。但同时&#xff0c;mRNA疫苗由于稳定性不足容易在保存、运输中降解&#xff0c…

控制台打印汉字的方法

wstring gL"自动定理证明"; wstring sL"自动定理证明器"; EditDistance editdistance(g,s); //int distanceleneditdistance.CalEditDistance(); wcout.imbue(locale("chs")); set<string>words; editdistance.GetDictionary(words); O…

模态对话框的父窗口设置

我的毕业设计基本是搞完了&#xff0c;那么最近几天在做一些测试和修改。其中就有一个问题折腾了我好久&#xff0c;今天才发现&#xff0c;原来是这么回事。 我创建了一个非模态的子对话框&#xff0c;然后在这个子对话框中又创建了一个模态对话框&#xff0c;结果意外的是点…

XSD标准架构-----xsd:element 元素详解

声明一个元素。 <elementabstract Boolean : falseblock (#all | List of (extension | restriction | substitution))default stringfinal (#all | List of (extension | restriction))fixed stringform (qualified | unqualified)id IDmaxOccurs (nonNegativeInte…

VS2010使用Skin++

转载自http://blog.sina.com.cn/s/blog_5d23890b0100icjj.html。 Skin的使用 一.使用皮肤 将SkinPPWTL.lib 、skinppwtl.dll 、SkinPPWTL.h三个文件及相应皮肤&#xff08;**.ssk&#xff09;拷贝至工程文件夹下&#xff1b;一般还要将这些文件放在Debug文件夹下。 1.在(VC…

美翻朋友圈:用Python生成蒙太奇马赛克图片

题图 | 视觉中国来源 | ZackSock&#xff08;ID:ZackSock&#xff09;我们有时候会听到这么一个词--“蒙太奇”&#xff0c;但却不知道这个词是什么意思。蒙太奇原为建筑学术语&#xff0c;意为构成、装配。而后又延伸为一种剪辑理论&#xff1a;当不同镜头拼接在一起时&#x…

在SQL Server 2008中配置文件流(FILESTREAM)

SQL Server 2008推出了一个新的特性叫做文件流(FILESTREAM)&#xff0c;它使得基于SQL Server的应用程序可以在文件系统中存储非结构化的数据&#xff0c;例如文档、图片、音频、视频等等。文件流主要将SQL Server数据库引擎和新技术文件系统(NTFS)集成在一起;它主要以varbinar…

mysql limit offset

Java代码 SELECT keyword FROM keyword_rank WHERE advertiserid59 order by keyword LIMIT 2 OFFSET 1; 比如这个SQL &#xff0c;limit后面跟的是2条数据&#xff0c;offset后面是从第1条开始读取 Java代码 SELECT keyword FROM keyword_rank WHERE advertiserid59 order …

获取磁盘符信息

项目中有个子模块是ftp客户端&#xff0c;需要罗列本地各个磁盘符&#xff0c;比如C盘、D盘、E盘、F盘。然后进行一些相关的上传下载就比较方便&#xff0c;具体样子如下所示&#xff1a; 需要利用一个Combox控件实现。 废话不多说&#xff0c;先上代码&#xff1a; void …

成为计算机视觉工程师的第一个月,我都学会了什么?

作者 | Richmond Alake译者 | 弯月题图 | 自视觉中国出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;我写这篇文章的目的是为了向那些没有接触过机器学习行业的人们介绍一下我作为计算机视觉工程师第一个月以来的体验&#xff0c;希望这些内部信息能够让你…

天然良方对付小病

打嗝、口臭、消化不良……我们的身体时常会受到一些小毛病的困扰。20位来自美国各大医院的权威医生在美国《预防》杂志网站上发表文章&#xff0c;向读者介绍了一些纯天然的便捷方法&#xff0c;来快速应对这些小病。 生姜止吐。先用热水冲泡生姜片&#xff0c;过滤后把姜汤倒在…

Spring中使用Schedule调度

在spring中两种办法使用调度&#xff0c;以下使用是在spring4.0中。 一、基于application配置文件&#xff0c;配置入下&#xff1a; 1 <bean id"jobDetail" class"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">…

DNS域名解析优化之tinydns/djbdns篇——测试篇

要开始还债了。 今天整理了一下一套bind9的配置&#xff0c;把记录都清理了一番。想了想&#xff0c;顺带安装了个geoipdns来做性能测试。整理记录的时候用bind-to-tinydns转换了一下记录格式。这些过程以后再说。 NS服务器是同一台Dell PowerEdge 2950。先启动的geoipdns&…

使用Combox控件的一个问题

Combox控件是MFC里边一个比较常用的控件&#xff0c;基本可以看成是一个文本框和一个下拉列表组合而成。但是我在用的时候碰到了一个问题&#xff0c;当我用AddString()函数加了4,5个字符串后&#xff0c;运行之后点击下拉箭头并没有下拉框的显示&#xff0c;或者说显示不出来。…