2015-03-31 4 views
0

Я использую следующий код, и код работает для некоторых изображений в порядке, но большинство изображений EXIF-данных не получается.Метаданные изображения (EXIF) с C#

ImageMetadata imageMetadata = new ImageMetadata(); 
public ImageMetadata ReadEXIFMetadata(string filepath) 
{ 
    FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read); 
    System.Drawing.Image image__1 = System.Drawing.Image.FromStream(fs); 
    PropertyItem[] imagePropertyItems = image__1.PropertyItems; 

    foreach (PropertyItem pi in imagePropertyItems) 
    { 
     switch ((EXIFProperty)pi.Id) 
     { 
      case EXIFProperty.Title: 
       imageMetadata.Title = Encoding.Unicode.GetString(pi.Value); 
       break; 
      case EXIFProperty.Author: 
       imageMetadata.Author = Encoding.Unicode.GetString(pi.Value); 
       //imageMetadata.Author = Encoding.UTF8.GetString(pi.Value) 
       break; 
      case EXIFProperty.Keywords: 
       imageMetadata.Keywords = Encoding.Unicode.GetString(pi.Value); 
       break; 
      case EXIFProperty.Comments: 
       imageMetadata.Comments = Encoding.Unicode.GetString(pi.Value); 
       //imageMetadata.Comments = Encoding.UTF8.GetString(pi.Value) 
       break; 
      default: 
       break; 
     } 
    } 
    fs.Close();  
    return imageMetadata; 
} 


public enum EXIFProperty 
{ 
    Title = 40091, 
    Author = 40093, 
    Keywords = 40094, 
    Comments = 40092 
} 
public class ImageMetadata 
{ 
    private string _title = string.Empty; 
    private string _author = string.Empty; 
    private string _keywords = string.Empty; 
    private string _comments = string.Empty; 
    public ImageMetadata() 
    { 
     this._title = string.Empty; 
     this._author = string.Empty; 
     this._keywords = string.Empty; 
     this._comments = string.Empty; 
    } 
    public ImageMetadata(string title, string author, string keywords, string comments) 
    { 
     this._title = title; 
     this._author = author; 
     this._keywords = keywords; 
     this._comments = comments; 
    } 
    public string Title 
    { 
     get 
     { 
      return this._title; 
     } 
     set 
     { 
      this._title = value; 
     } 
    } 
    public string Author 
    { 
     get 
     { 
      return this._author; 
     } 
     set 
     { 
      this._author = value; 
     } 
    } 
    public string Keywords 
    { 
     get 
     { 
      return this._keywords; 
     } 
     set 
     { 
      this._keywords = value; 
     } 
    } 
    public string Comments 
    { 
     get 
     { 
      return this._comments; 
     } 
     set 
     { 
      this._comments = value; 
     } 
    } 
} 

Исправьте меня, если я делаю что-то не так в приведенном выше коде. Помогите справиться с этой проблемой.

+0

Что происходит? – Rob

+0

'return imageMetadata' возвращается пустым, нет ошибки получения – Gitz

+0

Вы проверили, что изображение имеет свойства EXIF? Вы помещали точки останова в свой код, чтобы увидеть, где он находится, и что/не задано? –

ответ

1

Я не уверен, почему вы создали свой собственный класс ImageMetaData, так как у .NET уже есть его. Попробуйте:

BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile; 
BitmapMetadata importedMetaData = new BitmapMetadata("jpg"); 
using (Stream sourceStream = File.Open(fileName, FileMode.Open, FileAccess.Read)) 
{ 
    BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.Default); 
    // Check source is has valid frames 
    if (sourceDecoder.Frames[0] != null && sourceDecoder.Frames[0].Metadata != null) 
    { 
     sourceDecoder.Frames[0].Metadata.Freeze(); 
     // Get a clone copy of the metadata 
     BitmapMetadata sourceMetadata = sourceDecoder.Frames[0].Metadata.Clone() as BitmapMetadata; 
     importedMetaData = sourceMetadata; 
    } 
} 
return importedMetaData; 
+0

Но я не нахожу библиотеку для 'BitmapCreateOptions' в моем pprject – Gitz

+0

@ Запишите оператор using' using System.Windows.Media.Imaging; 'над вашим пространством имен и убедитесь, что вы ссылаясь на 'PresentationCore.dll' (что это автоматически, если это приложение WPF) – user1

+0

Откуда я получаю' PresentationCore.dll' ???? – Gitz