以下屏幕截图显示了打印出元数据时显示的内容,它旁边是与导出到我的mac机完全相同的图像,因此我可以查看图片中的所有数据(注意:这两个数据均未修改,因此是准确的相同)。
我用来获取位置数据的代码如下:
UIImage *image = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage];
NSData *data = UIImageJPEGRepresentation( image, 0.9f );
// EXIF DATA
CGImageSourceRef mySourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
if (mySourceRef != NULL)
{
NSDictionary *myMetadata = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(mySourceRef, 0, NULL);
NSDictionary *GPSDictionary = [myMetadata objectForKey:(NSString *)kCGImagePropertyGPSDictionary];
NSLog( @"%@", myMetadata );
// NSLog([GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLongitude]);
// NSLog([GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLatitude]);
NSLog( @"%@", [GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLongitude]);
NSLog( @"%@", [GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLatitude]);
}
编辑:为澄清起见,该应用程序有权使用相机胶卷和相机等。还在其他iPhone设备上进行了测试,以确保不仅仅是iPhone X问题
最佳答案
发现问题是因为我试图从临时图片获取GPS数据,该图片基本上是资产的jpeg重复表示。解决方法是通过执行以下操作从原始资产获取EXIF数据:
NSURL *assetURL = (NSURL*)[info objectForKey:UIImagePickerControllerReferenceURL];
NSData *originalData = (NSData*) [self retrieveAssetDataPhotosFramework:assetURL];
CGImageSourceRef mySourceRef = CGImageSourceCreateWithData((CFDataRef)originalData, NULL);
if (mySourceRef != NULL)
{
NSDictionary *myMetadata = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(mySourceRef,0,NULL);
NSDictionary *GPSDictionary = [myMetadata objectForKey:(NSString *)kCGImagePropertyGPSDictionary];
NSLog( @"%@", myMetadata );
NSLog( @"%@", [GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLongitude]);
NSLog( @"%@", [GPSDictionary valueForKey:(NSString*)kCGImagePropertyGPSLatitude]);
}
为了获取资产URL,我使用了一种在这里找到的方法(不能立即发送链接)
- (NSData *)retrieveAssetDataPhotosFramework:(NSURL *)urlMedia {
__block NSData *iData = nil;
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil];
PHAsset *asset = [result firstObject];
PHImageManager *imageManager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.synchronous = YES;
options.version = PHImageRequestOptionsVersionCurrent;
@autoreleasepool {
[imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
iData = [imageData copy];
NSLog(@"requestImageDataForAsset returned info(%@)", info);
}];
}
assert(iData.length != 0);
return iData;
}