最近在玩讀取圖片的Exif資訊,試了一下.NET內建的方法與別人包好的類別,但都不怎麼好用,最後找到CodeProject的ExifLibrary for .NET這篇,試起來功能算是滿齊全的,用起來也很容易,這邊稍稍記錄一下。

要使用ExifLibrary for .NET來做擷取圖片Exif的動作,首先我們必須下載組件並將之加入參考。

接著再將ExifLibrary命名空間加入,就可以開始進行程式部分的撰寫了。

using ExifLibrary;

程式撰寫時我們必須先取得ExifFile的物件實體,只要用ExifFile.Read將圖檔的位置帶入就可以了。

… ExifFile exifFile = ExifFile.Read(photoFile); …

有了ExifFile物件實體後,後續的動作就簡單多了,因為都是針對這個物件下去操作,像是要取得藏在圖檔Exif內的縮圖就可以透過ExifFile.Thumbnail.ToBitmap()。

… var thumbnail = exifFile.Thumbnail.ToBitmap(); …

而要取得圖檔的Exif資訊的話,可以直接透過ExifFile.Properties,並用ExifTag指定要取得的Exif資訊。

… var xResolution = exifFile.Properties[ExifTag.XResolution].Value; var yResolution = exifFile.Properties[ExifTag.YResolution].Value; …

也可以透過ExifFile.Properties.Values將圖檔所有的Exif資訊都逐一掃出。

… foreach (ExifProperty item in exifFile.Properties.Values) { tbxMessage.Text += string.Format("{0}:{1} “, item.Name, item.Value); } …

基本上ExifLibrary的大致操作就是那麼簡單,但是有一些要注意的事,就是ExifLibrary之所以好用在於它的架構切的還不錯,雖然我們透過ExifFile.Properties看到的都是ExifProperty型態(像是ExifURational就是繼承ExifProperty的類別),但不轉成本來的型態我們能取用的資訊就會有限。

因此在撰寫時若需要更詳細、更細部的資料的話,我們必須注意他本來的型態為何。

然後像下面這樣轉型後取用就可以了:

… var xResolution = (ExifURational)exifFile.Properties[ExifTag.XResolution]; var xResolutionNumerator = (int)xResolution.Value.Numerator; var xResolutionDenominator = (int)xResolution.Value.Denominator; …

最後附上筆者用來測試的完整程式碼片段:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using ExifLibrary;

namespace WindowsFormsApplication34 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

	private void btnLoad_Click(object sender, EventArgs e)
	{
		if (openFileDialog1.ShowDialog() == DialogResult.OK)
		{
			var photoFile = openFileDialog1.FileName;

			ExifFile exifFile = ExifFile.Read(photoFile);

			pbxThumbnail.Image = exifFile.Thumbnail.ToBitmap();

			tbxMessage.Clear();
			foreach (ExifProperty item in exifFile.Properties.Values)
			{
				tbxMessage.Text += string.Format("{0}:{1}

“, item.Name, item.Value); } } } } }

運行後可看到圖片內含的所有Exif資訊。

Link

	ExifLibrary for .NET