我尝试了多种方法来获取通过UIImagePickerController Camera
的图像的位置。
我想要达到的目标是,我想使用UIImagePickerController
Camera
选择一个图像,我必须将其保存到Photo Library
中,这样我才能收回PHAsset
1}}来自它以及与之相关的位置。
//MARK: Saving an Image to PhotoLibrary and taking back the PHAsset
class func savingThis(image : UIImage, completion : (asset : PHAsset?) -> ())
{
var localIdentifier : String?
let imageManager = PHPhotoLibrary.sharedPhotoLibrary()
imageManager.performChanges({ () -> Void in
let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
if let properAsset = request.placeholderForCreatedAsset {
localIdentifier = properAsset.localIdentifier
}
else {
completion(asset: nil)
}
}, completionHandler: { (success, error) -> Void in
if let properLocalIdentifier = localIdentifier {
let result = PHAsset.fetchAssetsWithLocalIdentifiers([properLocalIdentifier], options: nil)
if result.count > 0 {
completion(asset: result[0] as? PHAsset)
}
else {
completion(asset: nil)
}
}
else {
completion(asset: nil)
}
})
}
我试过这段代码,保存并取回PHAsset。但问题是这个PHAsset
没有任何与之相关的位置,想知道为什么?我错过了什么?
我认为我不必手动将GPS
数据设置为图片的元数据吗?我认为Photos Framework
或Asset Library
会照顾它。因此,如果您知道Asset Library
已被弃用,我们唯一的选择是使用Photos Framework
。我在网上看到,将图像保存到Photo Library
可以解决这个问题。这不正确吗?
还有其他选择吗?我应该使用UIImageWriteToSavedPhotosAlbum
方法将图片保存到Camera Roll
,我可以使用Photos Framework
收回最近的照片。但我不认为UIImageWriteToSavedPhotosAlbum
会照顾到位置事物。
你有什么想法吗?
答案 0 :(得分:2)
首先感谢所有善良的人来研究这个问题。
我找到了答案。
//MARK: Saving an Image to PhotoLibrary and taking back the PHAsset
class func savingThis(image : UIImage, completion : (asset : PHAsset?) -> ())
{
var localIdentifier : String?
let imageManager = PHPhotoLibrary.sharedPhotoLibrary()
imageManager.performChanges({ () -> Void in
let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
request.location = // Assigned current location here :)
if let properAsset = request.placeholderForCreatedAsset {
localIdentifier = properAsset.localIdentifier
}
else {
completion(asset: nil)
}
}, completionHandler: { (success, error) -> Void in
if let properLocalIdentifier = localIdentifier {
let result = PHAsset.fetchAssetsWithLocalIdentifiers([properLocalIdentifier], options: nil)
if result.count > 0 {
completion(asset: let asset = result[0] as? PHAsset)
}
else {
completion(asset: nil)
}
}
else {
completion(asset: nil)
}
})
}
答案 1 :(得分:0)
当您收到来自 UIImagePickerController
的回电时:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo
info: [UIImagePickerController.InfoKey : Any]) {}
您可以尝试从信息字典中获取图像位置。
为此,您需要请求相关的 PHAsset
对象:
if let assetImage = info[UIImagePickerController.InfoKey.phAsset] as? PHAsset {
print("Image location info = \( assetImage.location))")
}
重要 - 在使用此方法之前,您需要请求用户权限:
PHPhotoLibrary.requestAuthorization()
如果您不这样做,UIImagePickerController.InfoKey.phAsset
的信息字典将返回 nil
。