C#读取图片的EXIF信息
EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA ——Japan Electronic Industry Development Association) 制订,目前的版本是修改发表于1998年6月的2.1版。国际标准化组织(ISO)正在制订的相机文件设计标准(DCF —— Design role for Camera File system)就是以EXIF2.1格式为基础而设定的。记住,EXIF是一种图像文件格式,只是文件的后缀名还是沿用大家熟悉的jpg而已。实际上,EXIF信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的jpg文件的头部,也就是说EXIF信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过EXIF信息所记录的资讯更为详尽和完备。不过,具有EXIF 信息的JPEG图像文件要比普通的JPEG文件略大一点。就目前市场而言,新一代的数码相机都具有附加EXIF信息功能,大多数的数码相机厂商也都会随数码相机发售时附赠能够读取EXIF信息的软件,例如 Nikon 系列的数码相机就附赠 NikonView 软件,Agfa系列的相机则附赠 Photowize V1.8版,而富士相机附送的EXIF viewer软件更是这方面的领军人物(目前已在很多网站提供免费下载。还有一部分的数码相机会自动将EXIF信息转存成文档文件,例如:NIKON CoolPix 990和SONY FD系列。除了硬件厂商随数码相机附带的EXIF信息查看软件,很多专业的图像软件厂商在这方面也不甘示弱,相继推出自己公司看图软件的最新版来支持这种近乎完美的JPEG-EXIF图像信息附加技术,如最近刚推出的ACDSee 4.0版本,就对现在流行的各种数码相机有相当好的支持,在EXIF图像信息附加方面较之其3.0版本也有很大的进步。不管是硬件厂商的配套软件还是专业名门的看图工具,所有这些软件都是为了方便数码摄影者能更方便地保存查看摄影图像的重要信息。我们将这些读取EXIF信息的软件归纳后分为四类:专业 EXIF信息查看工具(以富士的EXIF viewer为例)、具有查看EXIF信息的强大通用看图工具(以ACDSee为例)、支持EXIF信息查看的操作系统(微软的Windows XP)以及可以修改EXIF信息的另类工具(EXIF Editer),而我们这里要讲的是通过C#读取图片的EXIF信息。
相关类(GetEXIFMetaData):因为代码比较长,有五百多行,我只能将关键代码的片段拿出来讲讲。
这个类中构造了两个结构MetadataDetail和Metadata,前者是为了存储EXIF中某元素信息的三种格式,起到中间转化的作用,一个是十六进制的索引信息,一个是没用处理过的信息代码,一个是显示信息。后面的那个结构就是存储一张图片所有EXIF信息元素的。有两个方法LookupEXIFValue和GetEXIFMetaData,前一个方法是处理特殊元素的对应显示的,后者从图片中读取相关信息然后填充到MetaData结构中。
- usingSystem;
- usingSystem.Drawing;
- usingSystem.Drawing.Imaging;
- usingSystem.Collections;
- usingSystem.ComponentModel;
- namespaceTest.Com
- {
- ///<summary>
- ///功能:获得图片EXIF信息
- ///作者:Rexsp
- ///创建日期:2004-03-20
- ///</summary>
- publicclassEXIFMetaData
- {
- #region构造函数
- ///<summary>
- ///构造函数
- ///</summary>
- publicEXIFMetaData()
- {
- }
- #endregion
- #region数据转换结构
- ///<summary>
- ///转换数据结构
- ///</summary>
- publicstructMetadataDetail
- {
- publicstringHex;//十六进制字符串
- publicstringRawValueAsString;//原始值串
- publicstringDisplayValue;//显示值串
- }
- #endregion
- #regionEXIF元素结构
- ///<summary>
- ///结构:存储EXIF元素信息
- ///</summary>
- publicstructMetadata
- {
- publicMetadataDetailEquipmentMake;
- publicMetadataDetailCameraModel;
- publicMetadataDetailExposureTime;//曝光时间
- publicMetadataDetailFstop;
- publicMetadataDetailDatePictureTaken;
- publicMetadataDetailShutterSpeed;//快门速度
- publicMetadataDetailMeteringMode;//曝光模式
- publicMetadataDetailFlash;//闪光灯
- publicMetadataDetailXResolution;
- publicMetadataDetailYResolution;
- publicMetadataDetailImageWidth;//照片宽度
- publicMetadataDetailImageHeight;//照片高度
- publicMetadataDetailFNumber;//f值,光圈数
- publicMetadataDetailExposureProg;//曝光程序
- publicMetadataDetailSpectralSense;//
- publicMetadataDetailISOSpeed;//ISO感光度
- publicMetadataDetailOECF;//
- publicMetadataDetailVer;//EXIF版本
- publicMetadataDetailCompConfig;//色彩设置
- publicMetadataDetailCompBPP;//压缩比率
- publicMetadataDetailAperture;//光圈值
- publicMetadataDetailBrightness;//亮度值Ev
- publicMetadataDetailExposureBias;//曝光补偿
- publicMetadataDetailMaxAperture;//最大光圈值
- publicMetadataDetailSubjectDist;//主体距离
- publicMetadataDetailLightSource;//白平衡
- publicMetadataDetailFocalLength;//焦距
- publicMetadataDetailFPXVer;//FlashPix版本
- publicMetadataDetailColorSpace;//色彩空间
- publicMetadataDetailInterop;//
- publicMetadataDetailFlashEnergy;//
- publicMetadataDetailSpatialFR;//
- publicMetadataDetailFocalXRes;//
- publicMetadataDetailFocalYRes;//
- publicMetadataDetailFocalResUnit;//
- publicMetadataDetailExposureIndex;//曝光指数
- publicMetadataDetailSensingMethod;//感应方式
- publicMetadataDetailSceneType;//
- publicMetadataDetailCfaPattern;//
- }
- #endregion
- #region查找EXIF元素值
- publicstringLookupEXIFValue(stringDescription,stringValue)
- {
- stringDescriptionValue=null;
- switch(Description)
- {
- case"MeteringMode":
- #regionMeteringMode
- {
- switch(Value)
- {
- case"0":
- DescriptionValue="Unknown";break;
- case"1":
- DescriptionValue="Average";break;
- case"2":
- DescriptionValue="CenterWeightedAverage";break;
- case"3":
- DescriptionValue="Spot";break;
- case"4":
- DescriptionValue="Multi-spot";break;
- case"5":
- DescriptionValue="Multi-segment";break;
- case"6":
- DescriptionValue="Partial";break;
- case"255":
- DescriptionValue="Other";break;
- }
- }
- #endregion
- break;
- case"ResolutionUnit":
- #regionResolutionUnit
- {
- switch(Value)
- {
- case"1":
- DescriptionValue="NoUnits";break;
- case"2":
- DescriptionValue="Inch";break;
- case"3":
- DescriptionValue="Centimeter";break;
- }
- }
- #endregion
- break;
- //省略N行相似代码
- }
- returnDescriptionValue;
- }
- #endregion
- #region取得图片的EXIF信息
- publicMetadataGetEXIFMetaData(stringPhotoName)
- {
- //创建一个图片的实例
- SystemSystem.Drawing.ImageMyImage=System.Drawing.Image.FromFile(PhotoName);
- //创建一个整型数组来存储图像中属性数组的ID
- int[]MyPropertyIdList=MyImage.PropertyIdList;
- //创建一个封闭图像属性数组的实例
- PropertyItem[]MyPropertyItemList=newPropertyItem[MyPropertyIdList.Length];
- //创建一个图像EXIT信息的实例结构对象,并且赋初值
- #region创建一个图像EXIT信息的实例结构对象,并且赋初值
- MetadataMyMetadata=newMetadata();
- MyMetadata.EquipmentMake.Hex="10f";
- MyMetadata.CameraModel.Hex="110";
- MyMetadata.DatePictureTaken.Hex="9003";
- MyMetadata.ExposureTime.Hex="829a";
- MyMetadata.Fstop.Hex="829d";
- MyMetadata.ShutterSpeed.Hex="9201";
- MyMetadata.MeteringMode.Hex="9207";
- MyMetadata.Flash.Hex="9209";
- MyMetadata.FNumber.Hex="829d";//
- MyMetadata.ExposureProg.Hex="";//
- MyMetadata.SpectralSense.Hex="8824";//
- MyMetadata.ISOSpeed.Hex="8827";//
- MyMetadata.OECF.Hex="8828";//
- MyMetadata.Ver.Hex="9000";//
- MyMetadata.CompConfig.Hex="9101";//
- MyMetadata.CompBPP.Hex="9102";//
- MyMetadata.Aperture.Hex="9202";//
- MyMetadata.Brightness.Hex="9203";//
- MyMetadata.ExposureBias.Hex="9204";//
- MyMetadata.MaxAperture.Hex="9205";//
- MyMetadata.SubjectDist.Hex="9206";//
- MyMetadata.LightSource.Hex="9208";//
- MyMetadata.FocalLength.Hex="920a";//
- MyMetadata.FPXVer.Hex="a000";//
- MyMetadata.ColorSpace.Hex="a001";//
- MyMetadata.FocalXRes.Hex="a20e";//
- MyMetadata.FocalYRes.Hex="a20f";//
- MyMetadata.FocalResUnit.Hex="a210";//
- MyMetadata.ExposureIndex.Hex="a215";//
- MyMetadata.SensingMethod.Hex="a217";//
- MyMetadata.SceneType.Hex="a301";
- MyMetadata.CfaPattern.Hex="a302";
- #endregion
- //ASCII编码
- System.Text.ASCIIEncodingValue=newSystem.Text.ASCIIEncoding();
- intindex=0;
- intMyPropertyIdListCount=MyPropertyIdList.Length;
- if(MyPropertyIdListCount!=0)
- {
- foreach(intMyPropertyIdinMyPropertyIdList)
- {
- stringhexVal="";
- MyPropertyItemList[index]=MyImage.GetPropertyItem(MyPropertyId);
- #region初始化各属性值
- stringmyPropertyIdString=MyImage.GetPropertyItem(MyPropertyId).
Id.ToString("x");- switch(myPropertyIdString)
- {
- case"10f":
- {
- MyMetadata.EquipmentMake.RawValueAsString=BitConverter.
ToString(MyImage.GetPropertyItem(MyPropertyId).Value);- MyMetadata.EquipmentMake.DisplayValue=Value.GetString
(MyPropertyItemList[index].Value);- break;
- }
- case"110":
- {
- MyMetadata.CameraModel.RawValueAsString=BitConverter.
ToString(MyImage.GetPropertyItem(MyPropertyId).Value);- MyMetadata.CameraModel.DisplayValue=Value.GetString
(MyPropertyItemList[index].Value);- break;
- }
- case"9003":
- {
- MyMetadata.DatePictureTaken.RawValueAsString=BitConverter.
ToString(MyImage.GetPropertyItem(MyPropertyId).Value);- MyMetadata.DatePictureTaken.DisplayValue=Value.GetString
(MyPropertyItemList[index].Value);- break;
- }
- //省略N行相似代码
- }
- #endregion
- index++;
- }
- }
- MyMetadata.XResolution.DisplayValue=MyImage.HorizontalResolution.ToString();
- MyMetadata.YResolution.DisplayValue=MyImage.VerticalResolution.ToString();
- MyMetadata.ImageHeight.DisplayValue=MyImage.Height.ToString();
- MyMetadata.ImageWidth.DisplayValue=MyImage.Width.ToString();
- MyImage.Dispose();
- returnMyMetadata;
- }
- #endregion
- }
- }
以上介绍C#读取图片的EXIF信息
【编辑推荐】