我正在使用UIImagePickerController
拍摄照片,然后将照片上传到WCF Service
。除了图像,我还需要发送到照片的纬度和经度。
如何从拍摄的照片中获取此信息?
我在线搜索但似乎无法找到一个好的信息来源。我已经看到了作为EXIF
委托方法的一部分通过UIImagePickerControllerMediaMetadata
密钥传递的didFinishPickingMediaWithInfo
数据。但是,当我将内容打印到日志时,没有位置信息。
我错过了什么,在拍照之前是否需要开启位置服务?或者有另一种获取信息的方式吗?
非常感谢。
答案 0 :(得分:15)
我已经想好了几天,最后得到了解决方案。如上所述,您可以使用 ALAssetsLibrary 。
图像选择器会为您提供一个字典,其中包含指向资产的网址。
ALAssetsLibrary 的assetForURL: resultBlock: failureBlock:
方法使用块。您可以从示例here中了解有关它们的更多信息。
所以这就是我们处理选择器给出的信息的方式:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) {
// We'll store the info to use in another function later
self.imageInfo = info;
// Get the asset url
NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];
// We need to use blocks. This block will handle the ALAsset that's returned:
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
// Get the location property from the asset
CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation];
// I found that the easiest way is to send the location to another method
[self handleImageLocation:location];
};
// This block will handle errors:
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"Can not get asset - %@",[myerror localizedDescription]);
// Do something to handle the error
};
// Use the url to get the asset from ALAssetsLibrary,
// the blocks that we just created will handle results
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:url
resultBlock:resultblock
failureBlock:failureblock];
}
[picker dismissModalViewControllerAnimated:YES];
[picker release];
}
接下来是处理图像和位置数据的方法:
- handleImageLocation:(CLLocation *)location
{
UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
// Do something with the image and location data...
}
当然,您也可以使用此键通过此方法获取有关图像的其他信息:
ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs
答案 1 :(得分:3)
现在已弃用 ALAssetLibrary ,这很复杂,请改用 Photos.Framework 。
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil)
if let asset = fetchResult.firstObject as? PHAsset
{
print(asset.location)
}
}
}
快速简便:)
答案 2 :(得分:1)
我想这是一个'错误'。 UIImagePickerViewController
不会返回您从中选择的图片的位置数据:正如您所发现的那样,它们会从元数据中删除。
但是,如果您使用ALAssetLibrary
来获取图片,则可以获取位置数据(以与图像关联的CLLocation
对象的形式)。此问题中有一些代码 - iphone image ALAsset problem - 可帮助您从ALAsset
获得UIImagePickerController
。
当然,如果您可以立即从选择器中获取该信息,这将更容易,因此请考虑向Apple提交功能请求。
答案 3 :(得分:1)
由于您的源类型似乎是UIImagePickerControllerSourceTypeCamera
,因此您很快就会非常沮丧,正如您已经知道的那样。位置信息似乎是MIA。
作为UIImageWriteToSavedPhotosAlbum()
(不参考已保存的图片)的替代方案,我尝试了 ALAssetsLibrary 和-writeImageToSavedPhotosAlbum:metadata:completionBlock:
(使用UIImagePickerControllerMediaMetadata
填充它,希望框架填写位置信息的空白。)
ALAssetPropertyLocation
信息。即使我使用save方法的方向变体,也没用。
此时,我认为唯一的办法似乎是incorporating your own location info, as outlined here。
我必须这样做似乎有点可疑,但是,因为我希望框架能够自动处理这个。事实上,我甚至无法获取之前拍摄照片的位置信息。这是在所有正确位置授予的所有权限,无论我使用哪种设备,iPhone或iPad。 (即使是相机应用程序有适当的权限,FWIW。)