C#讀取圖片的EXIF信息
C#讀取圖片的EXIF信息
EXIF,是英文Exchangeable Image File(可交換圖像文件)的縮寫,最初由日本電子工業(yè)發(fā)展協(xié)會(JEIDA ——Japan Electronic Industry Development Association) 制訂,目前的版本是修改發(fā)表于1998年6月的2.1版。國際標準化組織(ISO)正在制訂的相機文件設(shè)計標準(DCF —— Design role for Camera File system)就是以EXIF2.1格式為基礎(chǔ)而設(shè)定的。記住,EXIF是一種圖像文件格式,只是文件的后綴名還是沿用大家熟悉的jpg而已。實際上,EXIF信息就是由數(shù)碼相機在拍攝過程中采集一系列的信息,然后把信息放置在我們熟知的jpg文件的頭部,也就是說EXIF信息是鑲嵌在JPEG圖像文件格式內(nèi)的一組拍攝參數(shù),主要包括攝影時的光圈、快門、ISO、日期時間等各種與當時攝影條件相關(guān)的訊息,相機品牌型號,色彩編碼,拍攝時錄制的聲音以及全球定位系統(tǒng)(GPS)等信息。簡單的說,它就好像是傻瓜相機的日期打印功能一樣,只不過EXIF信息所記錄的資訊更為詳盡和完備。不過,具有EXIF 信息的JPEG圖像文件要比普通的JPEG文件略大一點。就目前市場而言,新一代的數(shù)碼相機都具有附加EXIF信息功能,大多數(shù)的數(shù)碼相機廠商也都會隨數(shù)碼相機發(fā)售時附贈能夠讀取EXIF信息的軟件,例如 Nikon 系列的數(shù)碼相機就附贈 NikonView 軟件,Agfa系列的相機則附贈 Photowize V1.8版,而富士相機附送的EXIF viewer軟件更是這方面的領(lǐng)軍人物(目前已在很多網(wǎng)站提供免費下載。還有一部分的數(shù)碼相機會自動將EXIF信息轉(zhuǎn)存成文檔文件,例如:NIKON CoolPix 990和SONY FD系列。除了硬件廠商隨數(shù)碼相機附帶的EXIF信息查看軟件,很多專業(yè)的圖像軟件廠商在這方面也不甘示弱,相繼推出自己公司看圖軟件的最新版來支持這種近乎完美的JPEG-EXIF圖像信息附加技術(shù),如最近剛推出的ACDSee 4.0版本,就對現(xiàn)在流行的各種數(shù)碼相機有相當好的支持,在EXIF圖像信息附加方面較之其3.0版本也有很大的進步。不管是硬件廠商的配套軟件還是專業(yè)名門的看圖工具,所有這些軟件都是為了方便數(shù)碼攝影者能更方便地保存查看攝影圖像的重要信息。我們將這些讀取EXIF信息的軟件歸納后分為四類:專業(yè) EXIF信息查看工具(以富士的EXIF viewer為例)、具有查看EXIF信息的強大通用看圖工具(以ACDSee為例)、支持EXIF信息查看的操作系統(tǒng)(微軟的Windows XP)以及可以修改EXIF信息的另類工具(EXIF Editer),而我們這里要講的是通過C#讀取圖片的EXIF信息。
相關(guān)類(GetEXIFMetaData):因為代碼比較長,有五百多行,我只能將關(guān)鍵代碼的片段拿出來講講。
這個類中構(gòu)造了兩個結(jié)構(gòu)MetadataDetail和Metadata,前者是為了存儲EXIF中某元素信息的三種格式,起到中間轉(zhuǎn)化的作用,一個是十六進制的索引信息,一個是沒用處理過的信息代碼,一個是顯示信息。后面的那個結(jié)構(gòu)就是存儲一張圖片所有EXIF信息元素的。有兩個方法LookupEXIFValue和GetEXIFMetaData,前一個方法是處理特殊元素的對應(yīng)顯示的,后者從圖片中讀取相關(guān)信息然后填充到MetaData結(jié)構(gòu)中。
- usingSystem;
- usingSystem.Drawing;
- usingSystem.Drawing.Imaging;
- usingSystem.Collections;
- usingSystem.ComponentModel;
- namespaceTest.Com
- {
- ///<summary>
- ///功能:獲得圖片EXIF信息
- ///作者:Rexsp
- ///創(chuàng)建日期:2004-03-20
- ///</summary>
- publicclassEXIFMetaData
- {
- #region構(gòu)造函數(shù)
- ///<summary>
- ///構(gòu)造函數(shù)
- ///</summary>
- publicEXIFMetaData()
- {
- }
- #endregion
- #region數(shù)據(jù)轉(zhuǎn)換結(jié)構(gòu)
- ///<summary>
- ///轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)
- ///</summary>
- publicstructMetadataDetail
- {
- publicstringHex;//十六進制字符串
- publicstringRawValueAsString;//原始值串
- publicstringDisplayValue;//顯示值串
- }
- #endregion
- #regionEXIF元素結(jié)構(gòu)
- ///<summary>
- ///結(jié)構(gòu):存儲EXIF元素信息
- ///</summary>
- publicstructMetadata
- {
- publicMetadataDetailEquipmentMake;
- publicMetadataDetailCameraModel;
- publicMetadataDetailExposureTime;//曝光時間
- publicMetadataDetailFstop;
- publicMetadataDetailDatePictureTaken;
- publicMetadataDetailShutterSpeed;//快門速度
- publicMetadataDetailMeteringMode;//曝光模式
- publicMetadataDetailFlash;//閃光燈
- publicMetadataDetailXResolution;
- publicMetadataDetailYResolution;
- publicMetadataDetailImageWidth;//照片寬度
- publicMetadataDetailImageHeight;//照片高度
- publicMetadataDetailFNumber;//f值,光圈數(shù)
- publicMetadataDetailExposureProg;//曝光程序
- publicMetadataDetailSpectralSense;//
- publicMetadataDetailISOSpeed;//ISO感光度
- publicMetadataDetailOECF;//
- publicMetadataDetailVer;//EXIF版本
- publicMetadataDetailCompConfig;//色彩設(shè)置
- publicMetadataDetailCompBPP;//壓縮比率
- publicMetadataDetailAperture;//光圈值
- publicMetadataDetailBrightness;//亮度值Ev
- publicMetadataDetailExposureBias;//曝光補償
- publicMetadataDetailMaxAperture;//最大光圈值
- publicMetadataDetailSubjectDist;//主體距離
- publicMetadataDetailLightSource;//白平衡
- publicMetadataDetailFocalLength;//焦距
- publicMetadataDetailFPXVer;//FlashPix版本
- publicMetadataDetailColorSpace;//色彩空間
- publicMetadataDetailInterop;//
- publicMetadataDetailFlashEnergy;//
- publicMetadataDetailSpatialFR;//
- publicMetadataDetailFocalXRes;//
- publicMetadataDetailFocalYRes;//
- publicMetadataDetailFocalResUnit;//
- publicMetadataDetailExposureIndex;//曝光指數(shù)
- publicMetadataDetailSensingMethod;//感應(yīng)方式
- 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)
- {
- //創(chuàng)建一個圖片的實例
- SystemSystem.Drawing.ImageMyImage=System.Drawing.Image.FromFile(PhotoName);
- //創(chuàng)建一個整型數(shù)組來存儲圖像中屬性數(shù)組的ID
- int[]MyPropertyIdList=MyImage.PropertyIdList;
- //創(chuàng)建一個封閉圖像屬性數(shù)組的實例
- PropertyItem[]MyPropertyItemList=newPropertyItem[MyPropertyIdList.Length];
- //創(chuàng)建一個圖像EXIT信息的實例結(jié)構(gòu)對象,并且賦初值
- #region創(chuàng)建一個圖像EXIT信息的實例結(jié)構(gòu)對象,并且賦初值
- 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信息
【編輯推薦】