2014-10-11 46 views
1

我想從jpg圖像中提取exif數據。 ExifLib似乎是一個很好的選擇來簡化這件事,所以我通過NuGet安裝它。ExifLib是否可用於WPF/XAML應用程序?

我又試圖使用示例代碼here上手(註釋掉的消息框代碼現在):

using (ExifReader reader = new ExifReader(@"C:\temp\testImage.jpg")) 
{ 
    // Extract the tag data using the ExifTags enumeration 
    DateTime datePictureTaken; 
    if (reader.GetTagValue<DateTime>(ExifTags.DateTimeDigitized, out datePictureTaken)) 
    { 
     // Do whatever is required with the extracted information 
     //System.Windows.MessageBox.Show(this, string.Format("The picture was taken on {0}", 
     // datePictureTaken), "Image information"); //, MessageBoxButtons.OK); 
    } 
} 

卻得到一個錯誤:

The best overloaded method match for 'ExifLib.ExifReader.ExifReader(System.IO.Stream)' has some invalid arguments

Argument 1: cannot convert from 'string' to 'System.IO.Stream'

both this line:

using (ExifReader reader = new ExifReader(@"C:\temp\testImage.jpg")) 

這是可修復的問題,還是ExifLib無法從WPF/XAML應用程序中使用?

如果ExifLib是而不是對於WPF/XAML應用程序可行的解決方案,還有什麼替代方案?

更新:

有了這個代碼,由西蒙麥肯齊的回答是:

private void btnLoadNewPhotoset_Click(object sender, RoutedEventArgs e) 
{ 
    using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (var stream = store.OpenFile("testImage.jpg", FileMode.Open)) 
    using (var reader = new ExifReader(stream)) 
    { 
     // ... 
    } 
} 

我仍然得到一個錯誤:

The type or namespace name 'IsolatedStorage' does not exist in the namespace 'System.IO' (are you missing an assembly reference?)

這是一個Windows應用商店(C#)應用在Visual Studio 2013中創建。該項目的屬性顯示它的目標是Windows 8.1,配置管理器顯示配置== debug,platfor M = 64)

我的項目顯示的參考文獻有:

.NET for Windows Store apps 
Bing.Maps.Xaml 
ExifLib 
Microsoft Visual C++ Runtime Package 
Windows 8.1 

我缺少什麼?

更新2:

當我在參考經理看Assemblies.Framework,它說,「所有的框架組裝的已經提到......」我想mscorlib.dll中應該是一個這些(它不列出它們)?

我搜索了我的硬盤驅動器「mscorlib.dll」,我有一百萬個,所有不同的大小和日期。我應該嘗試添加哪一個作爲參考?我已經將C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5中的一個從7/9/2012(文件大小爲2,564,528)轉換爲C:\ Program Files(x86 )\ Reference Assemblies \ Microsoft \ Framework.NETCore \ v4.5.1 ...來命名它。

思考「C:\ Program Files文件(x86)\參考大會\微軟\ Framework.NETCore \ v4.5.1」似乎是最好的選擇,我試圖通過瀏覽按鈕引用它,但是當我做到了,有罵:

enter image description here

在充分披露的利益,在參考經理爲Windows 8.1,它說,「在Windows 8.1 SDK已經被引用。「

對於Windows 8.1.Extensions,它讓我看到:

Microsoft Visual C++ 2013 Runtime Package for Windows 12.0 (unchecked) 
Microsoft Visual C++ 2013 Runtime Package 11.0 (checked) 

由於這似乎是警告的人的事業,我扭轉了他們的checkedness(選中2013年, 不加以制止,其他)

我還檢查:

Behaviors SDK (XAML) 12.0 
SQLite for Windows Runtime 3.8.6 (because I will eventually be using SQLite in this project) 

更新3:

我剛剛發現:「獨立存儲不適用於Windows應用商店應用程序。而應使用Windows Runtime API中包含的Windows.Storage命名空間中的應用程序數據類來存儲本地數據和文件。 。here

更新4:

我等待着西蒙的例子,但我想這可能是這樣的:

using Windows.Storage; 
using ExifLib; 
. . . 
private async void btnOpenImgFiles_Click(object sender, RoutedEventArgs e) 
{ 
    FileOpenPicker openPicker = new FileOpenPicker(); 
    openPicker.ViewMode = PickerViewMode.Thumbnail; 
    openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 
    openPicker.FileTypeFilter.Add(".jpg"); 
    openPicker.FileTypeFilter.Add(".jpeg"); 
    openPicker.FileTypeFilter.Add(".png"); 

    IReadOnlyList<StorageFile> files = await openPicker.PickMultipleFilesAsync(); 
    for (int i = 0; i < files.Count; i++) 
    { 
     using (var randomAccessStream = await files[i].OpenAsync(FileAccessMode.Read)) 
     using (var stream = randomAccessStream.AsStream()) 
     using (var exfrdr = new ExifReader(stream)) 
     { 
      // ...exfrdr 
     } 
    } 
} 
+1

這是一個Windows應用程序商店嗎? Windows商店應用程序無法直接訪問文件系統。因此,ExifReader在Windows Store應用程序中不提供字符串構造函數。您必須提供流,例如IsolatedStorageFileStream。 – 2014-10-11 03:40:31

+0

好吧,我試圖找到一個例子...試圖使用它,我得到,「無法找到類型或名稱空間名稱IsolatedStorageFile'(你是否缺少using指令或程序集引用?) 「 - 似乎不可解決。 – 2014-10-11 04:19:26

+0

它告訴你添加一個「使用」語句,即'使用System.IO.IsolatedStorage'。 – 2014-10-11 08:13:29

回答

1

字符串構造函數在Windows Phone/Windows Store應用程序中不可用,因爲它們不允許直接訪問文件系統。您將需要傳入包含圖像的流。以下是一個使用FileOpenPicker的示例。請注意,使用AsStream(...)IRandomAccessStream轉換爲Stream,以便與ExifReader一起使用。

using System; 
using System.IO; 
using Windows.Storage; 
using Windows.Storage.Pickers; 

// ... 

var picker = new FileOpenPicker(); 
picker.FileTypeFilter.Add(".jpg"); 
var file = await picker.PickSingleFileAsync(); 

using (var randomAccessStream = await file.OpenAsync(FileAccessMode.Read)) 
{ 
    using (var stream = randomAccessStream.AsStream()) 
    { 
     using (var reader = new ExifReader(stream)) 
     { 
      string model; 
      if (reader.GetTagValue(ExifTags.Model, out model)) 
      { 
       var dialog = new MessageDialog(model, "Camera Model"); 
       dialog.ShowAsync(); 
      } 
     } 
    } 
} 
+0

我確定這是正確的(畢竟,這是「從馬的嘴巴」),但請看我的更新。 – 2014-10-11 15:05:16

+1

如果您添加對mscorlib.dll的引用,該怎麼辦? – 2014-10-11 20:05:54

+0

請參閱更新2。 – 2014-10-12 01:18:41

2

這有沒有關係WPF
嘗試這樣的事情

using (ExifReader reader = new ExifReader(File.Open(@"C:\temp\testImage.jpg",FileMode.Open))) 
+0

我得到「名稱'文件'在當前上下文中不存在「和」名稱'FileMode'在當前上下文中不存在「。我錯過了一個程序集引用,還是我必須走一條完全不同的路線? – 2014-10-11 03:07:07

+0

這與WPF無關 - 這個問題很可能與Windows Phone/Store應用程序有關,而這些應用程序不允許直接訪問文件系統。 – 2014-10-11 08:23:24

相關問題