用C#讀取相片(JPG圖片)的EXIF信息的方法

来源:http://www.cnblogs.com/aspnetjia/archive/2016/03/08/5252789.html
-Advertisement-
Play Games

引言:EXIF,是英文Exchangeable Image File{}#endregion#region 數據轉換結構/// summary>/// 轉換數據結構/// /summary>public struct MetadataDetail{public string Hex;//十六進位字元


引言:EXIF,是英文Exchangeable Image File
{
}
#endregion#region 數據轉換結構
/// summary>
/// 轉換數據結構
/// /summary>
public struct MetadataDetail
{
public string Hex;//十六進位字元串
public string RawValueAsString;//原始值串
public string DisplayValue;//顯示值串
}
#endregion#region EXIF元素結構
/// summary>
/// 結構:存儲EXIF元素信息
/// /summary>
public struct Metadata
{
public MetadataDetail EquipmentMake;
public MetadataDetail CameraModel;
public MetadataDetail ExposureTime;//曝光時間
public MetadataDetail Fstop;
public MetadataDetail DatePictureTaken;
public MetadataDetail ShutterSpeed;// 快門速度
public MetadataDetail MeteringMode;//曝光模式
public MetadataDetail Flash;//閃光燈
public MetadataDetail XResolution;
public MetadataDetail YResolution;
public MetadataDetail ImageWidth;//照片寬度
public MetadataDetail ImageHeight;//照片高度public MetadataDetail FNumber;//f值,光圈數
public MetadataDetail ExposureProg;//曝光程式
public MetadataDetail SpectralSense;//
public MetadataDetail ISOSpeed;//ISO感光度
public MetadataDetail OECF;//
public MetadataDetail Ver;//EXIF版本
public MetadataDetail CompConfig;//色彩設置
public MetadataDetail CompBPP;//壓縮比率
public MetadataDetail Aperture;//光圈值
public MetadataDetail Brightness;//亮度值Ev
public MetadataDetail ExposureBias;//曝光補償
public MetadataDetail MaxAperture;//最大光圈值public MetadataDetail SubjectDist;// 主體距離
public MetadataDetail LightSource;//白平衡
public MetadataDetail FocalLength;//焦距
public MetadataDetail FPXVer;//FlashPix版本
public MetadataDetail ColorSpace;//色彩空間
public MetadataDetail Interop;//
public MetadataDetail FlashEnergy;//
public MetadataDetail SpatialFR;//
public MetadataDetail FocalXRes;//
public MetadataDetail FocalYRes;//
public MetadataDetail FocalResUnit;//
public MetadataDetail ExposureIndex;//曝光指數
public MetadataDetail SensingMethod;//感應方式
public MetadataDetail SceneType;//
public MetadataDetail CfaPattern;//
}
#endregion#region 查找EXIF元素值
public string LookupEXIFValue(string Description, string Value)
{
string DescriptionValue = null;switch(Description)
{
case "MeteringMode":#regionMeteringMode
{
switch(Value)
{
case "0":
DescriptionValue = "Unknown";break;
case "1":
DescriptionValue = "Average";break;
case "2":
DescriptionValue = "Center Weighted Average";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;
}
}
#endregionbreak;
case "ResolutionUnit":#region ResolutionUnit
{
switch(Value)
{
case "1":
DescriptionValue = "No Units";break;
case "2":
DescriptionValue = "Inch";break;
case "3":
DescriptionValue = "Centimeter";break;
}
}#endregionbreak;
//省略N行相似代碼}
return DescriptionValue;
}
#endregion#region 取得圖片的EXIF信息
public Metadata GetEXIFMetaData(string PhotoName)
{
// 創建一個圖片的實例
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
// 創建一個整型數組來存儲圖像中屬性數組的ID
int[] MyPropertyIdList = MyImage.PropertyIdList;
//創建一個封閉圖像屬性數組的實例
PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
//創建一個圖像EXIT信息的實例結構對象,並且賦初值#region 創建一個圖像EXIT信息的實例結構對象,並且賦初值
Metadata MyMetadata = new Metadata();
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.ASCIIEncoding Value = new System.Text.ASCIIEncoding();int index = 0;
int MyPropertyIdListCount=MyPropertyIdList.Length;
if(MyPropertyIdListCount!=0)
{
foreach (int MyPropertyId in MyPropertyIdList)
{
string hexVal = "";
MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId);#region 初始化各屬性值
string myPropertyIdString=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行相似代碼
}
#endregionindex++;
}
}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();
return MyMetadata;
}
#endregion
}
}然後就是個調用的問題,有了這個類,我如何讀取圖片的EXIF信息呢?代碼如下:
EXIFMetaData em = new EXIFMetaData();
string filePath=Server.MapPath("Test.jpg");//這裡可以動態傳遞圖片路徑的
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);//這裡就是調用,傳圖片絕對路徑
string exif = m.Ver.DisplayValue;
string camera = m.CameraModel.DisplayValue;
string model = m.CameraModel.DisplayValue;
string aperture = m.Aperture.DisplayValue;
string shutter = m.ShutterSpeed.DisplayValue;
string sensitive = m.ExposureIndex.DisplayValue;有什麼不明白的,歡迎提出來,此代碼經過測試,功能正常。

 轉載自:http://www.aspnetjia.com
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於在官方下載的ueditor包是在vs2012下開發的,可以在vs2010中使用,但在vs2008中就會報錯。折騰了一翻,現將解決方法分享給需要的朋友,其實就是把裡面包含.net4.0的元素換成.net3.5的 1、下載.net framework 3.5版的Newtonsoft.Json.dll
  • 原來用的是Kindeditor這個編輯器,但很久沒更新了,最新版是13年更新的。現在要換成百度的Ueditor, 在這裡記錄Ueditor的使用流程和遇到的問題。 一、下載 1.Ueditor官網 這裡有三個版本:1.UBuilder:可以自定義選擇自已需要的功能,然後會下載對應的文件。 2.開發版
  • 那天在調試API的時候,發現用c#寫的SHA1加密出來的結果和PHP中sha1()出來的不一樣,找了半天的原因後來才弄出來 在調試微信介面的時候大多的幫助文檔都是提供的是PHP的方法,所以在.net中實現的時候會出現很多的問題,最典型的就是token通不過驗證 現在提供一個結果與Php一樣 的SHA
  • 本次將考察三類工具,它們是每一位 MVC 程式員工具庫的成員:DI容器、單元測試框架和模仿工具。 1.創建一個示例項目 創建一個空 ASP.NET MVC 4 項目 EssentiaTools 。 1.1 創建模型類 在 Models 文件夾下新建 Product.cs 類文件 using Syst
  • 最強大腦有個小孩玩俄羅斯方塊游戲神乎其技,那麼,就寫一個吧,玩玩而已。 由於邏輯簡單,又作了一些簡化,所以代碼並不多。 using System; using System.Collections.Generic; using System.Linq; using System.Windows; u
  • 回到目錄 在MVC里,你的控制器對應的視圖一般是在Views目錄,而如果希望在Views里再分幾個模塊文件夾預設是不允許的,我們需要做一下設置,就可以實現Views下的多次文件夾層次了,例如,我們有產品模塊,用戶模塊,訂單模塊,我們就可以把它的文件夾結構設計成如下 用戶模塊:/views/UserM
  • ------解決方案--------------------------------------------------------1.看下你的輸出是不是包含在<ajax:AjaxPanel ID="AjaxPanel1" runat="server" ></ajax:AjaxPanel>標簽裡面;
  • 當應用程式需要和磁碟上的文件打交道的時候,就有了流的概念。流就像架設在應用程式所在記憶體和磁碟之間的一個管道。 大致思路 → 建立管道 //FileMode.Open打開現有文件,另外還有FileMode.Create, FileMode.Append //FileAccess表示對文件的操作許可權Fi
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...