Подтвердить что ты не робот

Как я могу узнать, когда на С# была запущена фотография на Vista?

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

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

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

4b9b3361

Ответ 1

Здесь так же быстро и чисто, как вы можете это получить. Используя 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.

Другие проекты с открытым исходным кодом, приведенные ниже, должны принять к сведению это. это огромное количество ударов при обработке тысяч файлов!

Ответ 2

        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);

Ответ 4

Я поддерживал простую библиотеку с открытым исходным кодом с 2002 года для извлечения метаданных из файлов изображений/видео.

// 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 раз быстрее, чем API WPF JpegBitmapDecoder/BitmapMetadata.

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Это может немного осложниться...

Ответ 7

В изображении будут введены данные EXIF. В Интернете есть несколько примеров, если вы ищете EXIF ​​и С#.

Ответ 8

    //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;
        }
    }