2017-01-08 20 views
1

Я пытаюсь получить данные Exif для камеры, скорости ISO и т. Д. В загрузке файла. Я могу получить некоторые теги (см. Ниже), но вам нужно руководствоваться извлечением элементов из каталогов Exif. Любые предложения, пожалуйста.MVC 5 Получить данные Exif для камеры

  IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName); 
     foreach (var directory in directories) 
      foreach (var tag in directory.Tags) 
       System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}")); 

     var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 
     var dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTime); 
     System.Diagnostics.Debug.WriteLine(string.Format("dateTime " + dateTime)); 

     // 
     Image img = Image.FromFile(strFileName); 
     ImageFormat format = img.RawFormat; 
     System.Diagnostics.Debug.WriteLine("Image Type : " + format.ToString()); 
     System.Diagnostics.Debug.WriteLine("Image width : " + img.Width); 
     System.Diagnostics.Debug.WriteLine("Image height : " + img.Height); 
     System.Diagnostics.Debug.WriteLine("Image resolution : " + (img.VerticalResolution * img.HorizontalResolution)); 
     System.Diagnostics.Debug.WriteLine("Image Pixel depth : " + Image.GetPixelFormatSize(img.PixelFormat)); 


     PropertyItem[] propItems = img.PropertyItems; 
     int count = 0; 
     ArrayList arrayList = new ArrayList(); 
     foreach (PropertyItem item in propItems) 
     { 
      arrayList.Add("Property Item " + count.ToString()); 
      arrayList.Add("iD: 0x" + item.Id.ToString("x")); 
      System.Diagnostics.Debug.WriteLine("PropertyItem item in propItems: " + item.Id.ToString("Name")); 
      count++; 
     } 

     ASCIIEncoding encodings = new ASCIIEncoding(); 
     try 
     { 
      string make = encodings.GetString(propItems[1].Value); 
      arrayList.Add("The equipment make is " + make.ToString() + "."); 
     } 
     catch 
     { 
      arrayList.Add("no Meta Data Found"); 
     } 

     ViewBag.listFromArray = arrayList; 
     return View(await db.ReadExifs.ToListAsync()); 
    } 

Две петли я знаю, грязный, но дает некоторый вывод:

Directory JPEG - Compression Type = Baseline 
Directory JPEG - Data Precision = 8 bits 
Directory JPEG - Image Height = 376 pixels 
Directory JPEG - Image Width = 596 pixels 
Directory JPEG - Number of Components = 3 
Directory JPEG - Component 1 = Y component: Quantization table 0, Sampling factors 2 horiz/2 vert 
Directory JPEG - Component 2 = Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert 
Directory JPEG - Component 3 = Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert 
Directory JFIF - Version = 1.1 
Directory JFIF - Resolution Units = inch 
Directory JFIF - X Resolution = 120 dots 
Directory JFIF - Y Resolution = 120 dots 
Directory JFIF - Thumbnail Width Pixels = 0 
Directory JFIF - Thumbnail Height Pixels = 0 
Directory File - File Name = FakeFoto03_large.Jpg 
Directory File - File Size = 66574 bytes 
Directory File - File Modified Date = Tue Jan 03 00:02:00 +00:00 2017 
Image Type : [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e] 
Image width : 596 
Image height : 376 
Image resolution : 14400 
Image Pixel depth : 24 

Спасибо. Y.

ответ

0

Решено. Этот блок:

  ArrayList arrayList = new ArrayList(); 

     IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName); 
     foreach (var directory in directories) 
      foreach (var tag in directory.Tags) 
       // System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}")); 
      arrayList.Add($"{tag.Name} = {tag.Description}"); 

     ViewBag.listFromArray = arrayList; 
     return View(await db.ReadExifs.ToListAsync()); 

Это производит (в случае фото, используемого в качестве источника) 120 тегов exif. Пример: Баланс белого Режим = Автоматический баланс белого

Цифровой зум Ratio = 1

Фокусное расстояние 35 = 28 мм

Тип Сбора Сцены = Стандартный

Control Gain = низкий коэффициент усиления до

Контраст = Нет

1

Если у изображения, которое вы обрабатываете, есть камера, ISO и т. Д., То будет выдан код метаданных-экстрактор. Предоставляемое изображение не должно содержать этих деталей.

0

Спасибо Дрю за ответ, отлично работает сейчас, вплоть до точки. в то время как фрагмент печатает на экран штрафа (160 элементов), я не могу назначить описание элементов переменной или массиву. Вот код:

  // start exif ############################### 
     var strFileName = Server.MapPath("~/uploads/" + fname + "_large" + extension); 
     System.Diagnostics.Debug.WriteLine(">>> ReadExifsController, fname: " + fname); 

     if (System.IO.File.Exists(strFileName)) 
     { 
      System.Diagnostics.Debug.WriteLine(">>> ReadExifsController File exists."); 
     } 

     ArrayList arrayList = new ArrayList(); 
     arrayList.Add("ArrayList start"); 

     IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName); 

foreach (var directory in directories) 
      foreach (var tag in directory.Tags) 
       System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}")); 
     count++; 

     ViewBag.listFromArray = arrayList; 
     return View(await db.ReadExifs.ToListAsync()); 
    }