目前我正在从 ALAssetsLibrary 转换为 PHPhotoLibrary 。
我想在JPEG文件上添加或覆盖GPS元数据,而不会丢失任何其他数据。
使用ALAssetsLibrary,我们可以像下面这样做
- (void)saveImageDataToPhotoAlbum:(NSData *)originalData
{
ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
NSDictionary *dataDic = [self getMetaDataWithGps:originalData];
[assetsLib writeImageDataToSavedPhotosAlbum:originalData
metadata:[self getMetadataWithGpsInfo:originalData]
completionBlock:^(NSURL *url, NSError *e) {
[self addToMyAlbum:url];
}];
}
- (NSDictionary *)getMetadataWithGpsInfo:(NSData *)originalData
{
CGImageSourceRef cimage = CGImageSourceCreateWithData((CFDataRef)data, nil);
NSDictionary *metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cimage, 0, nil);
NSMutableDictionary *metadataAsMutable = [NSMutableDictionary dictionaryWithDictionary:metadata];
metadataAsMutable[(NSString *)kCGImagePropertyGPSDictionary] = self.myGpsDic;
[metadata release];
CFRelease(cimage);
return metadataAsMutable;
}
但是对于 PHPhotoLibrary ,我不能做同样的事情。
我试图通过添加或覆盖GPS元数据来创建NSData(由JPEG文件制作)。 我可以使用GPS元数据创建和保存图像数据。 但它丢失了缩略图数据和其他数据(如制造商说明)。此外,文件大小([数据长度])从大约5MB减少到大约3MB。
使用GPS元数据创建图像数据的代码如下所示
- (NSData *)getDataWithGpsInfo:(NSData *)originalData
{
CGImageSourceRef cimage = CGImageSourceCreateWithData((CFDataRef)data, nil);
NSDictionary *metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cimage, 0, nil);
NSMutableDictionary *metadataAsMutable = [NSMutableDictionary dictionaryWithDictionary:metadata];
metadataAsMutable[(NSString *)kCGImagePropertyGPSDictionary] = self.myGpsDic;
NSMutableData *dataWithLocationInfo = [NSMutableData data];
CGImageDestinationRef dest =
CGImageDestinationCreateWithData((CFMutableDataRef)dataWithLocationInfo, CGImageSourceGetType(cimage), 1, nil);
CGImageDestinationAddImageFromSource(dest, cimage, 0, (CFDictionaryRef)metadataAsMutable);
CGImageDestinationFinalize(dest);
CFRelease(dest);
[metadata release];
CFRelease(cimage);
return dataWithLocationInfo;
}
如果是 ALAssetsLibraray ,添加GPS元数据之前/之后的文件大小几乎相同(5MB)。
我寻找并尝试了几种方法,例如以下问题,但他们无法解决此问题。
如果您有任何好主意,请告诉我。我很感激有关此问题的任何信息。
答案 0 :(得分:1)
我用TSI(技术支持事件)向Apple提出了这个问题。 但他们没有给出明确答案来解决问题。
现在我决定在使用添加位置信息保存图片时使用ALAssetsLibrary的API。
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;