【问题标题】:swift UIImagePickerController and extracting EXIF data from existing photosswift UIImagePickerController 并从现有照片中提取 EXIF 数据
【发布时间】:2018-09-28 12:06:06
【问题描述】:

我需要使用 UIImagePickerController 从 PhotoLibrary 中选取的图像中获取位置数据(纬度和经度坐标)。 Existing answers 建议使用 fetchAssetsWithALAssetURLs,但 iOS 8 到 11 已弃用,不知道有什么替代方案?

谢谢!

【问题讨论】:

    标签: swift uiimagepickercontroller exif


    【解决方案1】:

    这对我有用。对于新的 iOS 版本,请使用以下代码行。

    var asset: PHAsset?
    asset = info[UIImagePickerControllerPHAsset] as? PHAsset
    

    请注意asset = nil 如果用户没有授予访问他的照片库的权限,因为 PHAsset 数据是敏感的。

    要获得许可,请相应地编辑Info.plist 并使用PHPhotoLibrary.requestAuthorization() 请求许可。

    【讨论】:

    • 这是过时的 Swift 代码。由于您似乎使用的是旧版本的 Swift 和 Xcode,因此您对我的回答有疑问。
    【解决方案2】:

    如果您仅支持 iOS 11 及更高版本,则可以使用 .phAsset 键直接获取 PHAsset。如果您需要支持 iOS 10 或更早版本,则只需使用PHAsset fetchAssetsWithALAssetURLs

    获得PHAsset 引用后,您就可以访问location 属性来获取图像的坐标。

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        var asset: PHAsset?
        if #available(iOS 11.0, *) {
            asset = info[.phAsset] as? PHAsset
        } else {
            if let url = info[.referenceURL] as? URL {
                let result = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil)
                asset = result.firstObject
            }
        }
    
        if let asset = asset {
            if let location = asset.location {
                print("Image location is \(location.coordinate.latitude), \(location.coordinate.longitude)")
            }
        }
    }
    

    【讨论】:

    • 我们可以通过image.ciImage.properties得到它吗?
    • @TheTiger CIImage properties 似乎与图像元数据没有任何关系。它似乎与过滤器元数据有关。
    • 你检查过image.ciImage.properties[kCGImagePropertyGPSDictionary as String] 吗?我不确定,但这是我在this answer 中将位置添加到图像的方式。
    • @TheTiger 我真的什么都不知道CIImage properties。从照片库中选择图像时,image.ciImage 可能是nil,因此即使您可以从CIImage properties 获取位置,在这种情况下它也可能无法正常工作。无论哪种方式,问题和这个答案的重点都是关于通过 PHAsset 访问。如果您可以确认 CIImage 在这种情况下有效,请发布答案。
    • 您好,谢谢!我相应地添加了代码,我在“asset = info[.phAsset] as?PHAsset”行中得到了这个错误:“Slice>' is not convertible to 'PHAsset'”。我可以知道怎么了。对不起,如果这是一个菜鸟的错误,还是新手。
    猜你喜欢
    • 2010-11-17
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多