В настоящее время я перехожу с ALAssetsLibrary на PHPhotoLibrary.
Я хочу добавить или перезаписать метаданные GPS в файле JPEG без потери каких-либо других данных.
С 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 я не могу сделать то же самое.
Я попытался создать NSData (сделанный из файла JPEG) с добавлением или перезаписью метаданных GPS. Я мог создавать и сохранять данные изображений с метаданными GPS. Но он потерял данные эскизов и другие данные (например, заметку создателя). Кроме того, размер файла ([длина данных]) уменьшился примерно с 5 МБ до 3 МБ.
Мой код для создания данных изображения с метаданными 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 почти такой же (5 МБ).
Я искал и пробовал несколько способов, таких как следующие вопросы, но они не могут решить эту проблему.
Сохраните метаданные exif с помощью новой библиотеки PHPhotoLibrary
Написание фотографии с метаданными с помощью Photokit
Если у вас есть хорошая идея, дайте мне знать. Буду признателен за любую информацию по этой проблеме.