iOS保存照片到相机胶卷时无法保留EXIF / GPS元数据

6

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

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


这里有一个链接,展示了如何保存带元数据的照片。http://docs.xamarin.com/iOS/Recipes/Media/Video_and_Photos/Save_Photo_to_Album_with_Metadata - iDev
3个回答

7

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

– writeImageDataToSavedPhotosAlbum:metadata:completionBlock:

– writeImageToSavedPhotosAlbum:metadata:completionBlock:

根据您是否将图像作为实际UIImage或NSData,对应的内容可能会有所不同。
请注意,您必须正确设置字典的键,否则可能无法正确保存。
在这里,我们提供了GPS信息的示例: http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html
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”元数据保存它-这仅保留了文件的原始元数据。 - SaltyNuts

1

你要找的是UIImagePickerControllerDelegate。

从iOS 4.0开始,你可以将静态图像元数据与静态图像一起保存到相机胶卷中。为此,请使用Assets Library框架的writeImageToSavedPhotosAlbum:metadata:completionBlock:方法。请参阅UIImagePickerControllerMediaMetadata键的描述。

UIImagePickerControllerDelegate Protocol Reference


3
将内容翻译成中文: 将数据保存到资产库与UIImagePickerControllerDelegate无关,您指定的方法属于ALAssetsLibrary框架。 - Pochi

1

如果您需要一个使用Photos API的快速解决方案(ALAssetLibrary在iOS 9中已弃用),您可以查看我的解决方案这里,包括示例代码

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

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

还要注意,将图像数据转换为UIImage似乎会剥离元数据,因此请小心处理。


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