UIImagePickerController и извлекающий данные EXIF из существующих фотографий

В.NET можно использовать System.Environment.CurrentDirectory для получения каталога, с которого был запущен процесс.
System.Reflection.Assembly.GetExecutingAssembly().Location скажет Вам местоположение в настоящее время выполняющегося блока (это только интересно, если в настоящее время выполняющийся блок загружается из где-нибудь отличающегося, чем местоположение блока где запущенный процесс).

56
задан tomtaylor 6 August 2009 в 13:19
поделиться

8 ответов

Следуя внизу Alconja ниже, является хорошим способом охватывает проблему селектора потомков:

div *{ float: right; } 
div * *{ float: none; }

Это будет плавать все правильно, тогда дети все будут сбрасываться ни на что.

-121--2929466-

Непослушный способ сделать это - пройти представления uiimagePickerviewcontroller и выберите выбранное изображение в обратном вызове делегата.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

  id thumbnailView = [[[[[[[[[[picker.view subviews] 
                  objectAtIndex:0] subviews]
                  objectAtIndex:0] subviews]
                objectAtIndex:0] subviews]
                objectAtIndex:0] subviews]
              objectAtIndex:0];

  NSString *fullSizePath = [[[thumbnailView selectedPhoto] fileGroup] pathForFullSizeImage];
  NSString *thumbnailPath = [[[thumbnailView selectedPhoto] fileGroup] pathForThumbnailFile];

  NSLog(@"%@ and %@", fullSizePath, thumbnailPath);

}

Это даст вам путь к полноразмерным изображению, который вы можете открыть с библиотекой EXIF ​​по вашему выбору.

Но это вызывает частную API и эти имена методов будет обнаружено Apple, если вы отправите это приложение. Так что не делай этого, хорошо?

-2
ответ дан 26 November 2019 в 17:26
поделиться

Возможно, вы сможете хэшировать данные изображения, возвращаемые UIImagePickerController, и каждое из изображений в каталоге и сравнивать их.

0
ответ дан 26 November 2019 в 17:26
поделиться

Просто подумал, а пробовали ли вы TTPhotoViewController в проекте Three20 на GitHub?

Он предоставляет средство выбора изображений, которое может считывать данные из нескольких источников. Вы можете использовать его как альтернативу UIImagePickerController, или источник может дать вам подсказку, как понять, как получить необходимую информацию.

0
ответ дан 26 November 2019 в 17:26
поделиться

Есть ли конкретная причина, по которой вы хотите извлечь данные о местоположении из изображения? Альтернативой может быть получение местоположения отдельно с помощью инфраструктуры CoreLocation. Если вам нужны только геоданные, это может избавить вас от головной боли.

0
ответ дан 26 November 2019 в 17:26
поделиться

Это то, что публичный API не предоставляет, но может быть полезным для многих. Ваш основной выход - сообщить об ошибке в Apple , в которой описывается, что вам нужно (а также может быть полезно объяснить, зачем вам это нужно). Надеюсь, ваш запрос может быть включен в будущий выпуск.

После регистрации ошибки вы также можете использовать один из инцидентов технической поддержки разработчиков (DTS), которые были связаны с вашим членством в программе iPhone Developer Program. Если есть публичный способ сделать это, инженер Apple об этом узнает. В противном случае это может, по крайней мере, помочь привлечь больше внимания к вашему положению в материнском корабле. Удачи!

1
ответ дан 26 November 2019 в 17:26
поделиться

Вы посмотрели эту библиотеку exif iPhone?

http://code.google.com/p/iphone-exif/

Попробую на моей стороне. Я хотел бы получить координаты GPS (геотеги) с фотографии, сделанной с помощью UIImagePickerController :/

После более глубокого изучения, эта библиотека, кажется, берет информацию из NSData в качестве входа, а UIImagePickerController возвращает UIImage после того, как сделает снимок. Теоретически, если мы используем выбранный из категории UIkit для UIImage

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

Тогда мы можем преобразовать UIImage в экземпляр NSData, а затем использовать его с библиотекой iPhone exif.

UPDATE:
. Я дал тест упомянутой выше библиотеке, и похоже, что он работает. Однако из-за моего ограниченного знакомства с форматом EXIF и отсутствия в библиотеке высокоуровневого API, мне не удается получить значения для EXIF-тегов. Вот мой код на случай, если кто-то из вас может пойти дальше :


#import "EXFJpeg.h"

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
    NSLog(@"image picked %@ with info %@", image, editingInfo);
    NSData* jpegData = UIImageJPEGRepresentation (image,0.5);
    EXFJpeg* jpegScanner = [[EXFJpeg alloc] init];
    [jpegScanner scanImageData: jpegData];
    EXFMetaData* exifData = jpegScanner.exifMetaData;
    EXFJFIF* jfif = jpegScanner.jfif;
    EXFTag* tagDefinition = [exifData tagDefinition: [NSNumber numberWithInt:EXIF_DateTime]];
    //EXFTag* latitudeDef = [exifData tagDefinition: [NSNumber numberWithInt:EXIF_GPSLatitude]];
    //EXFTag* longitudeDef = [exifData tagDefinition: [NSNumber numberWithInt:EXIF_GPSLongitude]];
    id latitudeValue = [exifData tagValue:[NSNumber numberWithInt:EXIF_GPSLatitude]];
    id longitudeValue = [exifData tagValue:[NSNumber numberWithInt:EXIF_GPSLongitude]];
    id datetime = [exifData tagValue:[NSNumber numberWithInt:EXIF_DateTime]];
    id t = [exifData tagValue:[NSNumber numberWithInt:EXIF_Model]];
....
....

Поиск определения тегов в порядке, но все значения тегов возвращают nil :(

В случае, если вы хотите попробовать использовать библиотеку, вам нужно определить глобальную переменную, чтобы заставить ее работать (как объяснено в doc, но hum... :/)

BOOL gLogging = FALSE;

UPDATE 2
. Ответ здесь: iPhone - информация о местоположении доступа с фотографии UIImage не инкапсулирует мета-информацию, так что мы застряли: наверняка через этот интерфейс EXIF-информации не будет.

FINAL UPDATE
Хорошо, мне удалось заставить его работать, по крайней мере, правильно геопривязать фотографии, возвращаемые пикировщиком.
Перед запуском UIImagePickerController, вы можете использовать CLLocationManager для получения текущего CLocation
Как только он у вас есть, вы можете использовать этот метод, который использует библиотеку exif-iPhone для геотегирования UIImage из CLLocation :


-(NSData*) geotagImage:(UIImage*)image withLocation:(CLLocation*)imageLocation {
    NSData* jpegData =  UIImageJPEGRepresentation(image, 0.8);
    EXFJpeg* jpegScanner = [[EXFJpeg alloc] init];
    [jpegScanner scanImageData: jpegData];
    EXFMetaData* exifMetaData = jpegScanner.exifMetaData;
    // end of helper methods 
    // adding GPS data to the Exif object 
    NSMutableArray* locArray = [self createLocArray:imageLocation.coordinate.latitude]; 
    EXFGPSLoc* gpsLoc = [[EXFGPSLoc alloc] init]; 
    [self populateGPS: gpsLoc :locArray]; 
    [exifMetaData addTagValue:gpsLoc forKey:[NSNumber numberWithInt:EXIF_GPSLatitude] ]; 
    [gpsLoc release]; 
    [locArray release]; 
    locArray = [self createLocArray:imageLocation.coordinate.longitude]; 
    gpsLoc = [[EXFGPSLoc alloc] init]; 
    [self populateGPS: gpsLoc :locArray]; 
    [exifMetaData addTagValue:gpsLoc forKey:[NSNumber numberWithInt:EXIF_GPSLongitude] ]; 
    [gpsLoc release]; 
    [locArray release];
    NSString* ref;
    if (imageLocation.coordinate.latitude <0.0)
        ref = @"S"; 
    else
        ref =@"N"; 
    [exifMetaData addTagValue: ref forKey:[NSNumber numberWithInt:EXIF_GPSLatitudeRef] ]; 
    if (imageLocation.coordinate.longitude <0.0)
        ref = @"W"; 
    else
        ref =@"E"; 
    [exifMetaData addTagValue: ref forKey:[NSNumber numberWithInt:EXIF_GPSLongitudeRef] ]; 
    NSMutableData* taggedJpegData = [[NSMutableData alloc] init];
    [jpegScanner populateImageData:taggedJpegData];
    [jpegScanner release];
    return [taggedJpegData autorelease];
}

// Helper methods for location conversion -(NSMutableArray*) createLocArray:(double) val{ val = fabs(val); NSMutableArray* array = [[NSMutableArray alloc] init]; double deg = (int)val; [array addObject:[NSNumber numberWithDouble:deg]]; val = val - deg; val = val*60; double minutes = (int) val; [array addObject:[NSNumber numberWithDouble:minutes]]; val = val - minutes; val = val*60; double seconds = val; [array addObject:[NSNumber numberWithDouble:seconds]]; return array; } -(void) populateGPS:(EXFGPSLoc* ) gpsLoc :(NSArray*) locArray{ long numDenumArray[2]; long* arrPtr = numDenumArray; [EXFUtils convertRationalToFraction:&arrPtr :[locArray objectAtIndex:0]]; EXFraction* fract = [[EXFraction alloc] initWith:numDenumArray[0]:numDenumArray[1]]; gpsLoc.degrees = fract; [fract release]; [EXFUtils convertRationalToFraction:&arrPtr :[locArray objectAtIndex:1]]; fract = [[EXFraction alloc] initWith:numDenumArray[0] :numDenumArray[1]]; gpsLoc.minutes = fract; [fract release]; [EXFUtils convertRationalToFraction:&arrPtr :[locArray objectAtIndex:2]]; fract = [[EXFraction alloc] initWith:numDenumArray[0] :numDenumArray[1]]; gpsLoc.seconds = fract; [fract release]; }

29
ответ дан 26 November 2019 в 17:26
поделиться

Я потратил некоторое время, работая над этим и для приложения, которое я должен был построить по контракту. В принципе, в настоящее время API не может быть создано. Основной проблемой является STRIPS класса UIImage все EXIF-данные за исключением ориентации out. Кроме того, функция сохранения в камере отсекает эти данные. Таким образом, единственный способ получить и сохранить дополнительные данные EXIF - это сохранить их в личном "рулоне камеры" в вашем приложении. Я также подал эту ошибку в Apple и подчеркнул необходимость повторных обращений к рецензентам приложений, с которыми мы общались. Надеюсь, когда-нибудь они добавят его в... В противном случае, это делает наличие тегов GEO совершенно бесполезным, так как он работает только в "фондовой" приложение камеры.

ПРИМЕЧАНИЕ Некоторые приложения в магазине приложений взломать вокруг этого. К тому же, что я нашел, прямой доступ к ролику камеры и сохранение фотографий прямо на него для сохранения данных GEO. Однако это работает только с камерой ролл/сохранение фотографий и НЕ остальная часть фотобиблиотеки. На фотографиях, "синхронизированных" с телефоном с компьютера, все данные EXIF, за исключением ориентации, сняты.

Я до сих пор не могу понять, почему эти приложения были одобрены (пусть даже они УДАЛЯЮТСЯ из рулона камеры), и наше приложение, которое ничего из этого не делает, до сих пор удерживается.

2
ответ дан 26 November 2019 в 17:26
поделиться

Используйте ключ словаря UIImagePickerControllerMediaURL для получения URL исходного файла. Несмотря на то, что говорится в документации, вы можете получить URL файла для фотографий, а не только для фильмов.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    // Try to get the original file.
    NSURL *originalFile = [info objectForKey:UIImagePickerControllerMediaURL];
    if (originalFile) {
        NSData *fileData = [NSData dataWithContentsOfURL:originalFile];
    }
}
1
ответ дан 26 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: