Как я могу узнать, когда на С# была запущена фотография на Vista?
В Windows XP "FileInfo.LastWriteTime" вернет дату съемки - независимо от того, сколько раз файл перемещается в файловой системе.
В Vista вместо этого возвращается дата копирования изображения с камеры.
Как узнать, когда была сделана фотография в Vista? В проводнике Windows это поле называется "Дата взята".
Ответы
Ответ 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);
Ответ 3
С WPF и С# вы можете получить свойство Date Taken, используя класс BitmapMetadata:
MSDN - BitmapMetada
WPF и BitmapMetadata
Ответ 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;
}
}