我知道可以使用UIImageWriteToSavedPhotosAlbum
将UIImage保存到相机胶卷中,但此方法会从原始文件中删除所有元数据(EXIF,GPS数据等)。有没有办法保存原始文件,而不仅仅是将图像数据保存到iOS设备的相机胶卷?
编辑:我想我应该更具体一点。目的是将现有JPEG文件的副本保存到用户的相机胶卷中。什么是最有效的方法?
答案 0 :(得分:7)
根据您保存图像的方式,您可以选择 ALAssetsLibrary 提供的方法之一。
– writeImageDataToSavedPhotosAlbum:metadata:completionBlock:
– writeImageToSavedPhotosAlbum:metadata:completionBlock:
(取决于您是将图像作为实际UIImage还是NSData)
请注意,您必须为字典设置正确的密钥,否则可能无法正确保存。
以下是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];
这是一个键列表:
答案 1 :(得分:1)
UIImagePickerControllerDelegate是您正在寻找的。 p>
从iOS 4.0开始,您可以保存静态图像元数据,以及 静止图像,到相机胶卷。为此,请使用 writeImageToSavedPhotosAlbum:metadata:completionBlock:方法 资产库框架。请参阅说明 UIImagePickerControllerMediaMetadata key。
答案 2 :(得分:1)
对于使用Photos API的Swift解决方案(在iOS 9中已弃用ALAssetLibrary),您可以看到我对此问题的解决方案here, including sample code。
使用Photos API时,需要注意的一点是,PHAsset的.location属性不会将CLLocation元数据嵌入到文件本身中,因此使用EXIF查看器不会显示任何结果。
要解决此问题,您必须先将任何元数据更改直接嵌入到图像本身的数据中,然后再使用Photos API将其写入相机胶卷(或者,对于9之前的iOS版本,您必须使用以下内容编写临时文件:带有嵌入元数据的数据,并从文件的URL创建PHAsset。
另请注意,将图像数据转换为UIImage的行为似乎会删除元数据,因此请小心。