从UIImagePickerController获取图像位置

时间:2016-07-20 05:59:39

标签: ios objective-c swift uiimagepickercontroller photosframework

我尝试了多种方法来获取通过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 FrameworkAsset Library会照顾它。因此,如果您知道Asset Library已被弃用,我们唯一的选择是使用Photos Framework。我在网上看到,将图像保存到Photo Library可以解决这个问题。这不正确吗?

还有其他选择吗?我应该使用UIImageWriteToSavedPhotosAlbum方法将图片保存到Camera Roll,我可以使用Photos Framework收回最近的照片。但我不认为UIImageWriteToSavedPhotosAlbum会照顾到位置事物。

你有什么想法吗?

2 个答案:

答案 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