【发布时间】:2018-09-28 12:06:06
【问题描述】:
我需要使用 UIImagePickerController 从 PhotoLibrary 中选取的图像中获取位置数据(纬度和经度坐标)。 Existing answers 建议使用 fetchAssetsWithALAssetURLs,但 iOS 8 到 11 已弃用,不知道有什么替代方案?
谢谢!
【问题讨论】:
标签: swift uiimagepickercontroller exif
我需要使用 UIImagePickerController 从 PhotoLibrary 中选取的图像中获取位置数据(纬度和经度坐标)。 Existing answers 建议使用 fetchAssetsWithALAssetURLs,但 iOS 8 到 11 已弃用,不知道有什么替代方案?
谢谢!
【问题讨论】:
标签: swift uiimagepickercontroller exif
这对我有用。对于新的 iOS 版本,请使用以下代码行。
var asset: PHAsset?
asset = info[UIImagePickerControllerPHAsset] as? PHAsset
请注意asset = nil 如果用户没有授予访问他的照片库的权限,因为 PHAsset 数据是敏感的。
要获得许可,请相应地编辑Info.plist 并使用PHPhotoLibrary.requestAuthorization() 请求许可。
【讨论】:
如果您仅支持 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得到它吗?
CIImage properties 似乎与图像元数据没有任何关系。它似乎与过滤器元数据有关。
image.ciImage.properties[kCGImagePropertyGPSDictionary as String] 吗?我不确定,但这是我在this answer 中将位置添加到图像的方式。
CIImage properties。从照片库中选择图像时,image.ciImage 可能是nil,因此即使您可以从CIImage properties 获取位置,在这种情况下它也可能无法正常工作。无论哪种方式,问题和这个答案的重点都是关于通过 PHAsset 访问。如果您可以确认 CIImage 在这种情况下有效,请发布答案。