从 UIImagePickerController 获取图像位置

Posted

技术标签:

【中文标题】从 UIImagePickerController 获取图像位置【英文标题】:Get Image location from UIImagePickerController 【发布时间】:2016-07-20 05:59:39 【问题描述】:

我尝试了多种方法来获取通过UIImagePickerController Camera 拍摄的图像的位置。

我想要实现的是,我想使用 UIImagePickerController Camera 选择一个图像,我必须将它保存到 Photo Library 以便只有我可以从中取回 PHAsset 以及与其关联的位置。

   //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 会处理位置问题。

你有什么想法吗?

【问题讨论】:

你想获取图片的路径吗? 我正在使用 UIImagePickerController 通过将 Camera 设置为 UIImagePickerController 中的源类型来拍摄新照片。选择图像后,我将图像保存到照片库,并将其作为 PHAsset 取回。 PHAsset 没有任何关联的位置,我想要 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)

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

【讨论】:

【参考方案2】:

当您收到来自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

【讨论】:

以上是关于从 UIImagePickerController 获取图像位置的主要内容,如果未能解决你的问题,请参考以下文章

从 UITabBarController 驱动 UIImagePickerController

从 UIImagePickerController 保存视频

UIImagePickerController 从 UICollectionViewCell 内的 UIImageView 呈现

如何从 UIImagePickerController 获取图像文件名

从 UIImagePickerController 获取图像位置

从 UIImagePickerController 传递图像数据以进行后台处理