照片框架:从拾取器中保存exif数据(光圈,焦距,快门速度......)

时间:2015-02-22 22:38:32

标签: ios swift metadata uiimagepickercontroller exif

我正在尝试用新的Photo框架做相当于 writeImageToSavedPhotosAlbum

要保存图像,我只会这样做:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    let image = info[UIImagePickerControllerOriginalImage] as UIImage

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
              let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
            }, completionHandler: { (success, error) -> Void in
              //
            })
}

当然,没有魔法,因为我没有做任何事情

info[UIImagePickerControllerMediaMetadata]

,上面的代码不会将任何元数据保存到“相机胶卷”,因为当我将iPhone连接到Mac时,您可以使用Preview.app的屏幕截图看到。

enter image description here

您可以通过打开Preview.app,选择文件>来获取该视图。从“您的设备名称”导入;然后你可以浏览你的照片,看看用相机应用程序拍摄的那些显示exif 数据,如焦距,而使用上面代码保存的数据显示空值

现在,creationRequestForAssetFromImage的文档说:

  

要设置新创建的资源的元数据属性,请使用   更改请求的相应属性(在修改中列出)   资产)。

链接到“+ changeRequestForAsset:”和4个属性(creationDate,location,favorite,hidden),这有点轻松。那些人可能想要保存的其他属性(如光圈,焦距,快门速度......)?

你应该如何使用Photo框架在图像中保存元数据?

1 个答案:

答案 0 :(得分:3)

这是我最终做的事情:

extension UIImage {

  /**
  Gets the metadata from the photo album

  :param: info The picker dictionary
  :param: completionHandler A block to call when the metadata is available
  */
  class func requestMetadata(info: [NSObject : AnyObject], completionHandler: ([NSObject : AnyObject]) -> Void) {
      let assetUrl = info[UIImagePickerControllerReferenceURL] as! NSURL
      let result = PHAsset.fetchAssetsWithALAssetURLs([assetUrl], options: nil)
      if let asset = result.firstObject as? PHAsset {
        let editOptions = PHContentEditingInputRequestOptions()
        editOptions.networkAccessAllowed = true

        asset.requestContentEditingInputWithOptions(editOptions, completionHandler: { (contentEditingInput, _) -> Void in
            let url = contentEditingInput.fullSizeImageURL
            let orientation = contentEditingInput.fullSizeImageOrientation
            var inputImage = CoreImage.CIImage(contentsOfURL: url)
            completionHandler(inputImage.properties())
        })
    } else {
        completionHandler([:])
    }
  }
}