"Дата получения" не отображается в PropertyItems изображения, в то время как она отображается в сведениях о файле (свойствах файла) в проводнике Windows.
Я немного удивлен и озадачен. Я пытаюсь прочитать свойства объектов из изображения. В частности, меня интересует "Дата взятия". Я написал процедуру, которая делает именно это. Более менее. С некоторыми файлами работает отлично, но...
У меня есть некоторые файлы, в свойствах которых указано "Дата получения" (при просмотре в Windows Explorer, Windows 7 x64). Они отличаются от даты создания, изменения и доступа. Итак, у меня 4-е свидание. Однако, если я перебираю элементы свойства, он не отображается (ни для какого идентификатора). Когда я ищу его в PropertyItem.Id (0x9003 или 36867), я получаю, что элемент свойства не существует.
Мой код для циклического перебора элементов свойств:
for (int i = 0; i < fileNames.Length; i++)
{
FileStream fs = new FileStream(fileNames[i], FileMode.Open, FileAccess.Read);
Image pic = Image.FromStream(fs, false, false);
int t = 0;
foreach (PropertyItem pii in pic.PropertyItems)
{
MessageBox.Show(encoding.GetString(pii.Value, 0, pii.Len - 1) + " - ID: " + t.ToString());
t++;
}
}
Код для чтения только свойства "Дата получения" (я украл отсюда: http://snipplr.com/view/25074/)
public static DateTime DateTaken(Image getImage)
{
int DateTakenValue = 0x9003; //36867;
if (!getImage.PropertyIdList.Contains(DateTakenValue))
return DateTime.Parse("01-01-2000");
string dateTakenTag = System.Text.Encoding.ASCII.GetString(getImage.GetPropertyItem(DateTakenValue).Value);
string[] parts = dateTakenTag.Split(':', ' ');
int year = int.Parse(parts[0]);
int month = int.Parse(parts[1]);
int day = int.Parse(parts[2]);
int hour = int.Parse(parts[3]);
int minute = int.Parse(parts[4]);
int second = int.Parse(parts[5]);
return new DateTime(year, month, day, hour, minute, second);
}
Однако, когда я изменяю дату, взятую в "окне свойств файла" проводника Windows, он начинает отображаться в моей программе.
Итак, мой вопрос: откуда взялась эта дата? Как я могу получить к нему доступ? Может ли быть, что есть еще один источник информации, кроме данных EFIX?
Спасибо!
3 ответа
Вы можете попробовать что-то вроде этого, если вы хотите начать с базового кодирования
// Загружаем изображение как вам угодно. System.Drawing.Image image = new Bitmap("my-picture.jpg");
Referenced from AbbydonKrafts
// Get the Date Created property
//System.Drawing.Imaging.PropertyItem propertyItem = image.GetPropertyItem( 0x132 );
System.Drawing.Imaging.PropertyItem propertyItem
= image.PropertyItems.FirstOrDefault(i => i.Id == 0x132 );
if( propItem != null )
{
// Extract the property value as a String.
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
string text = encoding.GetString(propertyItem.Value, 0, propertyItem.Len - 1 );
// Parse the date and time.
System.Globalization.CultureInfo provider = CultureInfo.InvariantCulture;
DateTime dateCreated = DateTime.ParseExact( text, "yyyy:MM:d H:m:s", provider );
}
Измените точную строку разбора на следующую
DateTime dateCreated = DateTime.ParseExact (ConvertToString (dateTakenProperty).Substring (0, 19), "гггг: ММ: дд ЧЧ: мм: сс", поставщик)
В конце строки, вероятно, есть символ NUL, который не может быть обработан. Выполнение подстроки ожидаемой длины исправит это.
Что ж, я получаю "Измененную" дату моего файла изображения вместо "Дата получения". Я добился с помощью следующего кода:
public static System.DateTime GetImageDate(string filePath)
{
System.Drawing.Image myImage = Image.FromFile(filePath);
System.Drawing.Imaging.PropertyItem propItem = myImage.GetPropertyItem(36867);
string dateTaken = new System.Text.RegularExpressions.Regex(":").Replace(System.Text.Encoding.UTF8.GetString(propItem.Value), "-", 2);
return System.DateTime.Parse(dateTaken);
}