以下屏幕截图显示了打印出元数据时显示的内容,它旁边是与导出到我的mac机完全相同的图像,因此我可以查看图片中的所有数据(注意:这两个数据均未修改,因此是准确的相同)。
ios - GPSDictionary返回uiimage元数据中没有exif位置数据的nil-LMLPHP

我用来获取位置数据的代码如下:



    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;
}

10-04 22:19
查看更多