使用 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