如何在iPhone上保存带有EXIF(GPS)和方向的照片?

13

我正在使用 writeImageToSavedPhotosAlbum:metadata:completionBlock: 将图像保存到相机胶卷中(GPS 数据在传递给 metadata 的字典中)。但是图片方向不正确(因为我在拍照时翻转了设备)。

有另一个函数 writeImageToSavedPhotosAlbum:orientation:completionBlock:,但我将无法传递 EXIF 数据。

根据文档,有 kCGImagePropertyOrientation 属性可以手动设置方向,但我在检测设备当前方向并拍照后保存图像时遇到了问题。

是否有人实现了保存具有 EXIF 数据和正确方向的图像?任何帮助都将非常感激。

这是我的代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [self dismissModalViewControllerAnimated:YES];
    [imageView setImage:image];

    if(sourceCamera) {
        //EXIF and GPS metadata dictionary
        (...)

        //saving image
        ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];       
        [al writeImageToSavedPhotosAlbum:[image CGImage]
                                metadata:dict
                         completionBlock:^(NSURL *assetURL, NSError *error) {
                             if (error == nil) {
                                NSLog(@"saved");
                             } else {
                                 NSLog(@"error");
                             }
        }];        
        [al release];
    }
}

祝一切顺利,

a.

1个回答

27

在设置kCGImagePropertyOrientation时,您需要将UIImageOrientation值映射到相应的EXIF方向值。这个映射关系如下:

UIImageOrientationUp:             1
UIImageOrientationDown:           3
UIImageOrientationLeft:           8
UIImageOrientationRight:          6
UIImageOrientationUpMirrored:     2
UIImageOrientationDownMirrored:   4
UIImageOrientationLeftMirrored:   5
UIImageOrientationRightMirrored:  7

请注意UIImageOrientationLeft和UIImageOrientationRight与文档所描述的相反;当您将方向应用于竖直图像时,小样本图像就是您得到的结果,而不是应用方向后会得到一个竖直图像的原始图像数据的方向。


谢谢你的回答,你太棒了!UIImageOrientation,就是这么简单...找不到任何关于kCGImagePropertyOrientation和UIImageOrientation的解决方案。我真的很喜欢这个论坛! - akashic
无序状态,这很有道理,但在 OP 的代码中他应该在哪里进行设置,以及如何进行设置?OP 必须在某个地方实际设置 kCGImagePropertyOrientation 的值,对吗? - Ben Wheeler
3
你需要修改 ALAsset 的元数据字典。获取 ALAsset 后,以如下方式获取其元数据字典:myMetadataDictionary = [[myAsset defaultRepresentation] metadata]。然后,设置方向:myMetadataDictionary[(NSString *)kCGImagePropertyOrientation] = orientation,其中 orientation 是 @Anomie 给出的整数之一。 - Tim Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接