如何使用元数据丰富UIImage数据

时间:2019-05-03 00:28:26

标签: ios swift uiimage phasset

在我的应用中,我试图使图像数据具有元数据(位置,时间戳等)。我正在使用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

我知道我也可以使用AVCaptureSession创建自定义imageCapture控制器,并在AVCapturePhoto委托调用中使用.fileDataRepresentation()函数didFinishProcessingPhoto,但这不是我的首选。 / p>

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

我很确定mediaMetadata将没有位置信息。使用此CLLocation extension.

然后使用下面的功能将元数据添加到图像数据:

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
  }
}