【问题标题】:iOS saving photo to Camera Roll does not preserve EXIF/GPS metadataiOS 将照片保存到相机胶卷不会保留 EXIF/GPS 元数据
【发布时间】:2012-11-21 07:25:14
【问题描述】:

我知道 UIImage 可以使用UIImageWriteToSavedPhotosAlbum 保存到相机胶卷中,但是这种方法会从原始文件中删除所有元数据(EXIF、GPS 数据等)。有什么方法可以保存原始文件,而不仅仅是将图像数据保存到 iOS 设备的相机胶卷中?

编辑:我想我应该更具体一点。目的是将现有 JPEG 文件的副本保存到用户的相机胶卷中。最有效的方法是什么?

【问题讨论】:

标签: ios uiimage exif


【解决方案1】:

根据您保存图像的方式,您可以选择 ALAssetsLibrary 提供的方法之一。

– writeImageDataToSavedPhotosAlbum:metadata:completionBlock:

– writeImageToSavedPhotosAlbum:metadata:completionBlock:

(取决于您将图像作为实际的 UIImage 还是作为 NSData)

http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

请注意,您必须为字典设置正确的键,否则它们可能无法正确保存。

以下是 GPS 信息的示例:

NSDictionary *gpsDict = [NSDictionary dictionaryWithObjectsAndKeys:
                 [NSNumber numberWithFloat:fabs(loc.coordinate.latitude)], kCGImagePropertyGPSLatitude, 
                 ((loc.coordinate.latitude >= 0) ? @"N" : @"S"), kCGImagePropertyGPSLatitudeRef, 
                 [NSNumber numberWithFloat:fabs(loc.coordinate.longitude)], kCGImagePropertyGPSLongitude, 
                 ((loc.coordinate.longitude >= 0) ? @"E" : @"W"), kCGImagePropertyGPSLongitudeRef, 
                 [formatter stringFromDate:[loc timestamp]], kCGImagePropertyGPSTimeStamp, 
                 [NSNumber numberWithFloat:fabs(loc.altitude)], kCGImagePropertyGPSAltitude, 
                 nil];

这是一个键列表:

http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGImageProperties_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40005103

【讨论】:

  • – writeImageDataToSavedPhotosAlbum:metadata:completionBlock: 是保存现有文件时最简单的选择:从文件名中读取 NSData,并使用 nil 元数据保存它 - 这只是保留文件的原始元数据。跨度>
【解决方案2】:

UIImagePickerControllerDelegate 就是你要找的。​​p>

从 iOS 4.0 开始,您可以保存静止图像元数据,以及 静止图像,到相机胶卷。为此,请使用 writeImageToSavedPhotosAlbum:metadata:completionBlock: 方法 资产库框架。请参阅说明 UIImagePickerControllerMediaMetadata 键。

UIImagePickerControllerDelegate Protocol Reference

【讨论】:

  • 保存到资产库与 UIImagePickerControllerDelegate 无关。您指定的方法属于 ALAssetsLibrary 框架。
【解决方案3】:

对于使用 Photos API 的 Swift 解决方案(ALAssetLibrary 在 iOS 9 中已弃用),您可以查看我的解决方案 here, including sample code

对于 Photos API,需要注意的关键是 PHAsset 的 .location 属性不会将 CLLocation 元数据嵌入文件本身,因此使用 EXIF 查看器不会显示任何结果。

要解决这个问题,您必须将任何元数据更改直接嵌入到图像本身的数据中,然后再使用 Photos API 将其写入相机胶卷(或者,对于 9 之前的 iOS 版本,您必须使用嵌入元数据的数据并从文件的 URL 创建 PHAsset)。

另请注意,将图像数据转换为 UIImage 的行为似乎会剥离元数据,所以要小心。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2012-05-01
    • 2014-09-04
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2013-04-03
    • 2018-09-22
    相关资源
    最近更新 更多