UIImagePickerController и извлечение данных EXIF ​​из существующих фотографий - PullRequest
56 голосов
/ 06 августа 2009

Хорошо известно, что UIImagePickerController не возвращает метаданные фотографии после выбора. Однако несколько приложений в магазине приложений (Mobile Fotos, PixelPipe), по-видимому, могут читать исходные файлы и данные EXIF, хранящиеся в них, что позволяет приложению извлекать геоданные из выбранной фотографии.

Они, кажется, делают это, читая оригинальный файл из папки / private / var / mobile / Media / DCIM / 100APPLE / и пропуская его через библиотеку EXIF.

Однако я не могу найти способ сопоставления фотографии, возвращенной из UIImagePickerController, с файлом на диске. Я исследовал размеры файлов, но исходный файл представляет собой JPEG, в то время как возвращаемое изображение является необработанным UIImage, что делает невозможным определение размера файла выбранного изображения.

Я рассматриваю возможность создания таблицы хэшей и сопоставления с первыми x пикселями каждого изображения. Это кажется немного чрезмерным и, вероятно, довольно медленным.

Есть предложения?

Ответы [ 18 ]

0 голосов
/ 02 августа 2012

Для того, чтобы получить эти метаданные, вы должны будете использовать структуру нижнего уровня AVFoundation.

Взгляните на пример Apple's Squarecam (http://developer.apple.com/library/ios/#samplecode/SquareCam/Introduction/Intro.html)

Найдите метод ниже и добавьте строку, которую я добавил в код. Возвращенный словарь метаданных также содержит диагностический объект NSDictionary.

- (BOOL)writeCGImageToCameraRoll:(CGImageRef)cgImage withMetadata:(NSDictionary *)metadata
{

   NSDictionary *Exif = [metadata objectForKey:@"Exif"];   // Add this line

}
0 голосов
/ 09 ноября 2009

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

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

0 голосов
/ 07 сентября 2010

кажется, что фотография, полученная UIImagePickerControllerMediaURL, вообще не имеет тегов exif

0 голосов
/ 13 января 2010

Непослушный способ сделать это - пересмотреть виды 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, если вы отправите это приложение. Так что не делай этого, хорошо?

0 голосов
/ 09 ноября 2009

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

0 голосов
/ 05 марта 2017

Это в Swift 3, если вы все еще хотите поддержку iOS 8:

import AssetsLibrary

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if picker.sourceType == UIImagePickerControllerSourceType.photoLibrary,
        let url = info[UIImagePickerControllerReferenceURL] as? URL {

        let assetLibrary = ALAssetsLibrary()
        assetLibrary.asset(for: url, resultBlock: { (asset) in
            if let asset = asset {
                let assetRep: ALAssetRepresentation = asset.defaultRepresentation()
                let metaData: NSDictionary = assetRep.metadata() as NSDictionary
                print(metaData)
            }
        }, failureBlock: { (error) in
            print(error!)
        })
    }

}
0 голосов
/ 10 октября 2017

для iOS 10 - Swift 3

Обратный вызов сборщика имеет info дикт, где есть ключ с метаданными : UIImagePickerControllerMediaMetadata

Image picker metadata example

0 голосов
/ 29 октября 2009

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

...