2008-10-07 2 views
36

В Windows XP «FileInfo.LastWriteTime» вернет дату съемки - независимо от того, сколько раз файл перемещается в файловой системе.Как узнать, когда на C# была запущена фотография на Vista?

В Vista вместо этого указывается дата копирования изображения с камеры.

Как узнать, когда сделана фотография в Vista? В проводнике Windows это поле называется «Date Taken».

ответ

78

Вот так же быстро и чисто, как вы можете его получить. Используя FileStream, вы можете указать GDI + не загружать все изображение для проверки. Он работает на скорости более 10 раз на моей машине.

//we init this once so that if the function is repeatedly called 
    //it isn't stressing the garbage man 
    private static Regex r = new Regex(":"); 

    //retrieves the datetime WITHOUT loading the whole image 
    public static DateTime GetDateTakenFromImage(string path) 
    { 
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     using (Image myImage = Image.FromStream(fs, false, false)) 
     { 
      PropertyItem propItem = myImage.GetPropertyItem(36867); 
      string dateTaken = r.Replace(Encoding.UTF8.GetString(propItem.Value), "-", 2); 
      return DateTime.Parse(dateTaken); 
     } 
    } 

И да, правильный идентификатор 36867, а не 306.

Другие проекты с открытым исходным кодом ниже следует принять к сведению. это ОГРОМНЫЙ успех при обработке тысяч файлов!

5

С WPF и C# вы можете получить дату Взятые свойства, используя класс BitmapMetadata:

MSDN - BitmapMetada

WPF and BitmapMetadata

+0

Могу ли я использовать BitmapMetadata с Window.Forms или это только WPF? (получение странных сообщений об ошибках из Visual Studio 2008) – sepang 2008-10-07 20:42:32

+0

Или используйте [мою библиотеку] (http://stackoverflow.com/a/39839380/24874), которая имеет более простой API и работает примерно в 17 раз быстрее, чем эти API WPF (или 30 раз быстрее, если вы хотите только Exif). – 2016-10-03 21:05:18

1

вы должны проверить информацию EXIF ​​от изображения. Я не думаю, что с регулярными функциями .Net вы узнаете, когда была сделана фотография.

Это может получить немного сложнее ...

1

Там будет EXIF ​​данные, внедренные в изображении. Есть много примеров в Интернете, если вы ищете EXIF ​​и C#.

2

В Windows XP «FileInfo.LastWriteTime» будет возвращающий дату картина принято - независимо от того, сколько раз файл перемещается вокруг в файловой системы.

У меня есть большие сомнения, что XP на самом деле это делал. Скорее всего, инструмент, который вы использовали для копирования изображения с камеры на жесткий диск, был перезапущен с измененной датой файла к принятой дате изображения.

+0

Инструмент был проводником окон. – sepang 2008-10-07 21:18:20

+0

ах .. Это могло бы объяснить это. Камера представляет собой небольшой компьютер с файловой системой. Когда фотография снимается, она записывается на диск. Explorer сохраняет их при копировании. – 2008-10-07 23:13:03

10
Image myImage = Image.FromFile(@"C:\temp\IMG_0325.JPG"); 
PropertyItem propItem = myImage.GetPropertyItem(306); 
DateTime dtaken; 

//Convert date taken metadata to a DateTime object 
string sdate = Encoding.UTF8.GetString(propItem.Value).Trim(); 
string secondhalf = sdate.Substring(sdate.IndexOf(" "), (sdate.Length - sdate.IndexOf(" "))); 
string firsthalf = sdate.Substring(0, 10); 
firsthalf = firsthalf.Replace(":", "-"); 
sdate = firsthalf + secondhalf; 
dtaken = DateTime.Parse(sdate); 
+1

ACTUALLY, 306 - последний идентификатор даты MODIFIED ... Я пробовал, и это было ОЧЕНЬ ЗАКРЫТО ... Однако, глядя на ВСЕ ИДЫ ИДЕНТОВ ИДЕИ И ИСПОЛЬЗУЯ В текстовый файл, я обнаружил, что ID 36867 был принятой датой (хотя 36868 также имеет такое же значение Date Taken, поэтому я не уверен, что было) – DRapp 2011-02-06 20:23:31

+0

ответ выше должен быть изменен на ответ, насколько скорость получения EXIFG, если она существует. Этот метод работает, но медленный - особенно в пакетном режиме! – TheSoftwareJedi 2012-04-02 02:01:33

0
//retrieves the datetime WITHOUT loading the whole image 
    public static DateTime GetDateTakenFromImage(string path) 
    { 
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     using (Image myImage = Image.FromStream(fs, false, false)) 
     { 
      PropertyItem propItem = null; 
      try 
      { 
       propItem = myImage.GetPropertyItem(36867); 
      } 
      catch { } 
      if (propItem != null) 
      { 
       string dateTaken = r.Replace(Encoding.UTF8.GetString(propItem.Value), "-", 2); 
       return DateTime.Parse(dateTaken); 
      } 
      else 
       return new FileInfo(path).LastWriteTime; 
     } 
    } 
4

С 2002 года я поддерживал simple open-source library для извлечения метаданных из изображений/видеофайлов.

// Read all metadata from the image 
var directories = ImageMetadataReader.ReadMetadata(stream); 

// Find the so-called Exif "SubIFD" (which may be null) 
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 

// Read the DateTime tag value 
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal); 

В моих тестах, этот код работает более 12 раз быстрее, чем Image.GetPropertyItem, и около 17 раз быстрее, чем WPF JpegBitmapDecoder/BitmapMetadata API.

В библиотеке имеется тонна дополнительной информации, такой как настройки камеры (F-stop, ISO, скорость затвора, режим вспышки, фокусное расстояние, ...), свойства изображения (размеры, конфигурации пикселей) и другие вещи такие как позиции GPS, ключевые слова, информация об авторских правах и т. д.

Если вас интересуют только метаданные, использование этой библиотеки происходит очень быстро, так как оно не декодирует изображение (то есть растровое изображение).Вы можете сканировать тысячи изображений за несколько секунд, если у вас достаточно свободного места для хранения.

ImageMetadataReader понимает многие типы файлов (JPEG, PNG, GIF, BMP, TIFF, PCX, WebP, ICO, ...). Если вы знаете , что вы имеете дело с JPEG, и вы только хотите данные Exif, то вы можете сделать этот процесс еще быстрее со следующим:

var directories = JpegMetadataReader.ReadMetadata(stream, new[] { new ExifReader() }); 

метаданных экстрактор библиотека доступна через NuGet и code's on GitHub. Благодаря всем удивительным вкладчикам, которые улучшили библиотеку и представили тестовые изображения на протяжении многих лет.

Смежные вопросы