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 = ; 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 信息的更多相关文章
- 利用php获取图片完整Exif信息类 获取图片详细完整信息类
<?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...
- 获取图片的EXIF信息
对于专业的摄影师来说,Exif信息是很重要的信息,也包含了非常多的东西 1.EXIF EXIF(Exchangeable Image File)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照 ...
- IOS: 使用imageIO获取和修改图片的exif信息
使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...
- 在Android下通过ExifInterface类操作图片的Exif信息
什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...
- 使用PHP获取图像文件的EXIF信息
在我们拍的照片以及各类图像文件中,其实还保存着一些信息是无法直观看到的,比如手机拍照时会有的位置信息,图片的类型.大小等,这些信息就称为 EXIF 信息.一般 JPG . TIFF 这类的图片文件都会 ...
- 用C#读取图片的EXIF信息的方法
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
- js获取图片的EXIF,解决图片旋转问题
相信大家在做项目的时候会遇到在canvas里加入图片时,图片发生90°,180°的旋转.当时的你肯定时懵逼的,为毛. 其实这就是图片的EXIF搞的鬼. 什么是EXIF 简单来说,Exif 信息就是由数 ...
- 使用Java程序读取JPG Tif等格式图片的exif信息
package com.util; import java.io.File;import java.util.Iterator; import com.drew.imaging.ImageProces ...
- Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)
Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...
随机推荐
- rsync安装使用
安装 yum install rsync mkdir /etc/rsyncd cd /etc/rsyncd vi rsyncd.conf pid file = /var/run/rsyncd.pid ...
- pb中创建连接webservice对象实例方法
try soapConnection conn // Define SoapConnectionHospitalServiceSoap in_hhzswebser // Declare proxyin ...
- ASP.NET MVC4 学习系统一(项目模板)
项目模板 1.空模板 空模板用于创建ASP.NETMVC 4网站的架构,包含基本的文件夹结构,以及需要引用的asp.netmvc程序集,也包含可能要使用的javaScript 库.模板同样包 ...
- HTML5-新API选择器
新的选择器document.querySelector("selector");selector:根据CSS选择器返回第一个匹配到的元素,如果没有匹配到,则返回null;支持: C ...
- MITM to crack Https connections
Everybody knows that https is http over SSL, and https is a secure way for protecting confidential d ...
- Linux下yum安装MPlayer 或 LVC视频播放器
添加第三方源 su -c 'rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noar ...
- Android IOS WebRTC 音视频开发总结(四五)-- ORTC背后的真相
本文主要介绍ORTC(Object Real-time Communication),支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. - ...
- Solaris进程管理
ps-a 列出与终端有关的进程-e 列出所有进程-A 同-e-f 列出进程完整信息-l 生成一个长列表-u username 列出某用户的进程 常用:ps -ef ...
- 高仿精仿开心网应用android源码
今天早上看到了一个不错的安卓应用源码项目,真的非常不错高仿精仿开心网应用android源码下载,希望大家能够喜欢. 原文:http://android.662p.com/thread-29 ...
- 简单linux字符设备驱动程序
本文代码参考<LINUX设备驱动程序>第三章 字符设备驱动程序 本文中的“字符设备”是一段大小为PAGE_SIZE的内存空间 功能:向字符设备写入字符串:从字符设备读出字符串 代码: 1. ...