使用 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum:metadata:completionBlock 复制照片:更改图像方向

Posted

技术标签:

【中文标题】使用 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum:metadata:completionBlock 复制照片:更改图像方向【英文标题】:Copying a photo with ALAssetsLibrary's writeImageToSavedPhotosAlbum:metadata:completionBlock: changes image orientation 【发布时间】:2014-06-26 18:29:33 【问题描述】:

我正在编写一个应用程序,它从照片库中获取现有照片,删除 GPS 元数据,并使用新元数据写出照片的副本。复制的照片在手机上的照片应用程序和 OS X 的 Preview.app 中正确显示,但 Image Capture.app 以错误的方向显示它。我不知道为什么会这样。

将原始照片和处理后的照片都导入计算机并在 Preview.app 中打开它们表明所有元数据都是相同的(除了缺少的 GPS 字典)。在我的测试照片中,预览表明原件和副本都有“方向:3(旋转 180)”,而预览实际上显示了正确的方向。但是 Image Capture 将副本显示为上下颠倒,而原始显示正确。显然,我在代码中遗漏了一些东西,但是什么?这是从 UIImagePickerController 的 resultBlock 调用的代码:

// Make a copy of a photo, minus the GPS metadata tags.
- (void)copyPhoto:(ALAsset *)asset fromAssetsLibrary:(ALAssetsLibrary *)library

    // Get the image's current metadata
    ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation];
    NSDictionary *metadata = [assetRepresentation metadata];
    NSMutableDictionary *mutableMetadata = [metadata mutableCopy];

    // Remove the GPS tags
    [mutableMetadata removeObjectForKey:@"GPS"];

    // Write out a copy
    [library writeImageToSavedPhotosAlbum:[assetRepresentation fullResolutionImage] metadata:mutableMetadata completionBlock:^(NSURL *assetURL, NSError *error) 
        if (!error) 
            NSLog(@"We wrote out a picture!");
        
    ];

谢谢!

【问题讨论】:

不删除GPS键是否还会出现问题?如果您将键的值更改为北极之类的东西而不是删除它,是否会发生这种情况? 好问题。如果我根本不更改元数据,它仍然会发生。 【参考方案1】:

图像以默认方向和元数据中指定的实际方向写入磁盘的原因是,相机硬件可以快速连续拍摄多张照片并立即保存它们,而无需每次都转换图像数据。

当您以编程方式将 UIImage 对象写入 ios Photo 库时,我相信它实际上会根据 UIImage 对象的 imageOrientation 属性将像素数据转换为正确的旋转,然后再将其写出。因此,当您调用 writeImageToSavedPhotosAlbum:metadata:completionBlock: 时,它会将图像数据转换为正确的旋转,但您仍在为原始元数据提供现在无效的图像方向值。

尝试剥离方向元数据以及 GPS 信息。

【讨论】:

你确定吗?写入照片库的图像是CGImageRef,而不是UIImage。据我所知,这些根本没有额外的方向数据。 我不是 100% 确定,但值得一试。使用仅旋转 90 度而不是 180 度的图像来推断发生了什么可能更容易。 谢谢,我会从这个角度调查。有没有办法从现有照片中获取元数据并写出副本,而无需系统将 JPEG 解压缩为图像然后解压缩它?也许如果它只是被认为是一个比特流,那么它就不会像你描述的那样调整方向。

以上是关于使用 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum:metadata:completionBlock 复制照片:更改图像方向的主要内容,如果未能解决你的问题,请参考以下文章

保存图像元数据 PHPhotoLibrary 与 ALAssetsLibrary

iOS - ALAssetsLibrary 使用的缓存数据未更新

ALAssetsLibrary 获取相机胶卷

尝试使用 ALAssetsLibrary 检索一组照片

我如何仅使用 ALAssetsLibrary 获取视频

ALAssetsLibrary.enumerateGroupsWithTypes Swift 中的第一个参数