C# 获取图片的EXIF 信息

news/2024/7/5 2:01:20

关于 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();}

 


http://lihuaxi.xjx100.cn/news/256082.html

相关文章

机器学习的出现,是否意味着“古典科学”的过时?

作者&#xff1a;Laura Spinney译者&#xff1a;刘媛媛原文&#xff1a;Are we witnessing the dawn of post-theory science?让我们回忆一下&#xff0c;Isaac Newton 被一个苹果砸中头部&#xff0c;然后是怎么提出牛顿第二定律——万有引力的&#xff1f;大概过程是这样的&…

不做调参侠,重视数据及处理能力?吴恩达发起的Data-Centric赛事总结!

赛题名称&#xff1a;Data-Centric AI Competition比赛官网&#xff1a;https://https-deeplearning-ai.github.io/data-centric-comp/比赛链接&#xff1a;https://worksheets.codalab.org/worksheets/0x7a8721f11e61436e93ac8f76da83f0e6赛题介绍在大多数机器学习比赛中&…

UUID正在被NanoID取代?

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典UUID 是软件开发中最常用的通用标识符之一。然而&#xff0c;在过去的几年里&#xff0c;其他的竞品挑战了它的存在。其中&#xff0c;NanoID 是 UUID 的主要竞争对手之一。因此&#xff0c;在本文中&#xff0c;我们将展…

ASP.NET Core 2 学习笔记(七)路由

ASP.NET Core通过路由(Routing)设定&#xff0c;将定义的URL规则找到相对应行为&#xff1b;当使用者Request的URL满足特定规则条件时&#xff0c;则自动对应到相符合的行为处理。从ASP.NET就已经存在的架构&#xff0c;而且用法也很相似&#xff0c;只有些许的不同。本篇将介绍…

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 …

基于 OpenCV 的表格文本内容提取

作者 | 小白来源 | 小白学视觉小伙伴们可能会觉得从图像中提取文本是一件很麻烦的事情&#xff0c;尤其是需要提取大量文本时。PyTesseract是一种光学字符识别&#xff08;OCR&#xff09;&#xff0c;该库提了供文本图像。PyTesseract确实有一定的效果&#xff0c;用PyTessera…

周礼栋:成熟的AI不再只是谈“颠覆”!

Datawhale推荐 作者&#xff1a;周礼栋&#xff0c;微软亚洲研究院院长身为世界级计算机专家&#xff0c;IEEE&#xff08;电气与电子工程师学会&#xff09;与 ACM&#xff08;国际计算机学会&#xff09;双料院士&#xff0c;新任微软亚洲研究院&#xff08;MSRA&#xff09;…

StableDiffusion嵌入现实世界,能在墙上直接长出小猫咪,手机可玩

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达衡宇 发自 凹非寺量子位 | 公众号 QbitAI注意看&#xff0c;你面前是一堵平平无奇的墙。现在&#xff0c;你可以按照自己的意愿&#xff0c;让它直接凭空长出点东西来。比如…