Как обогатить данные UIImage метаданными - PullRequest
0 голосов
/ 03 мая 2019

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

info[UIImagePickerController.InfoKey.originalImage]
info[UIImagePickerController.InfoKey.phAsset] 
info[UIImagePickerController.InfoKey.mediaMetadata]

Так что для изображений, выбранных из библиотеки .phAsset, есть все, что мне нужно.Я просто использую функцию .getDataFromPHAsset, чтобы получить обогащенные данные.Однако для только что сделанных снимков .phAsset - ноль.Я думал о попытке как-то объединить .originalImage и .mediaMetadata в один объект Data, но не смог получить желаемый результат.Я попытался использовать этот подход: https://gist.github.com/kwylez/a4b6ec261e52970e1fa5dd4ccfe8898f

Я знаю, что я также могу сделать собственный контроллер imageCapture, используя AVCaptureSession, и использовать AVCapturePhoto function .fileDataRepresentation() при didFinishProcessingPhoto делегатском вызове, но это не такмой первый выбор.

Любая помощь высоко ценится.

1 Ответ

1 голос
/ 03 мая 2019

Я уверен, что в mediaMetadata не будет информации о местоположении.Используйте это расширение CLLocation.

Затем используйте функцию ниже, чтобы добавить метаданные к данным изображения:

func addImageProperties(imageData: Data, properties: NSMutableDictionary) -> Data? {
  let dict = NSMutableDictionary()
  dict[(kCGImagePropertyGPSDictionary as String)] = properties

  if let source = CGImageSourceCreateWithData(imageData as CFData, nil) {
    if let uti = CGImageSourceGetType(source) {
      let destinationData = NSMutableData()
      if let destination = CGImageDestinationCreateWithData(destinationData, uti, 1, nil) {
        CGImageDestinationAddImageFromSource(destination, source, 0, dict as CFDictionary)
        if CGImageDestinationFinalize(destination) == false {
          return nil
        }                    
        return destinationData as Data
      }
    }
  }
  return nil
}

Использование:

if let imageData = image.jpegData(compressionQuality: 1.0), let metadata = locationManager.location?.exifMetadata() {
  if let newImageData = addImageProperties(imageData: imageData, properties: metadata) {
    // newImageData now contains exif metadata
  }
}
...