ALAssetPropertyDate возвращает «неправильную» дату - PullRequest
4 голосов
/ 17 мая 2011

В настоящее время я работаю над проектом, в котором мне нужно прочитать некоторые данные EXIF ​​(широта, долгота и дата). Данные о местоположении кажутся правильными, но дата, которую я получаю, кажется датой последнего изменения.

{
    CLLocation *loc = [asset valueForProperty:ALAssetPropertyLocation];
    NSDate *date = [asset valueForProperty:ALAssetPropertyDate];
    //Returns Last modified date(Picture was taken ... let's say september 
    //last year and it would return the date and time I 'modified' the image).
    NSString *latitude  = [NSString stringWithFormat:@"%g",loc.coordinate.latitude];//Returns correct Latitude
    NSString *longitude = [NSString stringWithFormat:@"%g",loc.coordinate.longitude];//Returns correct Longitude
}

Мой вопрос: я делаю что-то ужасно неправильно или это ожидаемое поведение. Я также попытался использовать loc.timestamp вместо [asset valueForProperty:ALAssetPropertyDate], но они вернули ту же дату. Любая помощь с благодарностью!

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

Вы также можете получить Exif DateTimeOriginal через ALAsset.

NSDateFormatter *dateFormatter = [[NSDateFormatter new] autorelease];
dateFormatter.dateFormat = @"y:MM:dd HH:mm:ss";
NSDate *date = [dateFormatter dateFromString:[[[[asset defaultRepresentation] metadata] objectForKey:@"{Exif}"] objectForKey:@"DateTimeOriginal"]];

Для получения метаданных из ресурса требуется загрузить заголовок Exif в память (или весь файл изображения?), И эти методы, похоже, используютпул автозапуска для областей памяти.Это может привести к нехватке памяти или к еще большему сбою, если вы выполняете пакетный процесс для тысяч изображений.

Чтобы обойтись при нехватке памяти, вы можете использовать специальный пул автоматического выпуска.

NSDateFormatter *dateFormatter = [[NSDateFormatter new] autorelease];
dateFormatter.dateFormat = @"y:MM:dd HH:mm:ss";
for (ALAsset *asset in thousandsOfAssets) {
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    NSDate *date = [dateFormatter dateFromString:[[[[asset defaultRepresentation] metadata] objectForKey:@"{Exif}"] objectForKey:@"DateTimeOriginal"]];
    // do something
    [pool release];
}

РЕДАКТИРОВАТЬ: исправить неправильный формат даты (SS -> SS).Спасибо @ code-roadie

0 голосов
/ 17 мая 2011

Хотя это явно не задокументировано, я предполагаю, что это ожидаемое поведение. Дата относится к тому моменту, когда был создан актив , и когда вы изменяете изображение, вы, вероятно, неявно создаете новый актив. Ничто в документации ALAsset не предполагает, что его свойства соответствуют данным EXIF ​​изображения.

Чтобы получить доступ к данным EXIF, вы можете использовать инфраструктуру ввода-вывода Image (доступна с iOS 4.0), в частности, функцию CGImageSourceCopyProperties.

...