照片框架:从选择器中保存 exif 数据(光圈、焦距、快门速度……)
Photo framework: save exif data from picker (aperture, focal length, shutter speed, …)
我正在尝试使用新的照片框架执行 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]
,上面的代码不会将任何元数据保存到 "Camera Roll",正如您在将我的 iPhone 连接到我的 [= 时使用 Preview.app 的屏幕截图所看到的43=].
您可以通过打开 Preview.app、选择文件 > 从 "you device name" 导入来获得该视图;然后你可以浏览你的照片,看到用相机应用程序拍摄的照片显示exif数据,如焦距,而用上面代码保存的照片显示空值.
现在 creationRequestForAssetFromImage 的文档说:
To set metadata properties of the newly created asset, use the
corresponding properties of the change request (listed in Modifying
Assets).
它链接到“+changeRequestForAsset:”和 4 个属性(创建日期、位置、收藏夹、隐藏),这有点轻。人们可能想要保存的其他属性(如光圈、焦距、快门速度……)如何?
您应该如何使用 Photo 框架保存图像中的元数据?
这是我最后做的事情:
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([:])
}
}
}
我正在尝试使用新的照片框架执行 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]
,上面的代码不会将任何元数据保存到 "Camera Roll",正如您在将我的 iPhone 连接到我的 [= 时使用 Preview.app 的屏幕截图所看到的43=].
您可以通过打开 Preview.app、选择文件 > 从 "you device name" 导入来获得该视图;然后你可以浏览你的照片,看到用相机应用程序拍摄的照片显示exif数据,如焦距,而用上面代码保存的照片显示空值.
现在 creationRequestForAssetFromImage 的文档说:
To set metadata properties of the newly created asset, use the corresponding properties of the change request (listed in Modifying Assets).
它链接到“+changeRequestForAsset:”和 4 个属性(创建日期、位置、收藏夹、隐藏),这有点轻。人们可能想要保存的其他属性(如光圈、焦距、快门速度……)如何?
您应该如何使用 Photo 框架保存图像中的元数据?
这是我最后做的事情:
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([:])
}
}
}