Не удалось сохранить изображение с пользовательскими метаданными
Я пытаюсь создать собственную галерею изображений в своем приложении для iOS. Я хотел бы позволить пользователю иметь возможность сохранять определенные метаданные с изображением, чтобы впоследствии их можно было найти в приложении с прикрепленной информацией.
Во-первых, когда пользователь делает снимок, приложение сохраняет изображение в пользовательский альбом для приложения:
UITextField *nameField = [alertView textFieldAtIndex:0];
NSMutableDictionary *metaData = [[NSMutableDictionary alloc] init];
[metaData setObject:currentEvent forKey:kMetaDataEventKey];
[metaData setObject:[AppDelegate getActivePerson].name forKey:kMetaDataPersonKey];
[metaData setObject:nameField.text forKey:kMetaDataNameKey];
NSLog(@"Saving image with metadata: %@", metaData);
NSMutableDictionary *realMetaData = [[NSMutableDictionary alloc] init];
[realMetaData setObject:metaData forKey:kCGImagePropertyTIFFDictionary];
[library saveImage:imageToSave toAlbum:albumName metadata:realMetaData withCompletionBlock:^(NSError *error) {
if ( error != nil )
{
NSLog(@"Error saving picture? %@", error);
}
[self.tableView reloadData];
}];
При сохранении я получаю следующее сообщение:
Saving image with metadata: {
Event = t;
Person = "George James";
PictureName = tt;
}
Затем, когда я пытаюсь получить изображения позже, я использую эту функцию
-(void) loadAssets
{
self.assets = [NSMutableArray arrayWithCapacity:album.numberOfAssets];
[album enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if ( result != nil )
{
NSDictionary *metaData = result.defaultRepresentation.metadata;
NSLog(@"Retrieved image metadata: %@", metaData);
}
else
{
[self.tableView reloadData];
}
}];
}
Но журнал указывает, что он не успешно сохранил метаданные, связанные с изображением:
Retrieved image metadata: {
ColorModel = RGB;
DPIHeight = 72;
DPIWidth = 72;
Depth = 8;
Orientation = 1;
PixelHeight = 720;
PixelWidth = 960;
"{Exif}" = {
ColorSpace = 1;
ComponentsConfiguration = (
1,
2,
3,
0
);
ExifVersion = (
2,
2,
1
);
FlashPixVersion = (
1,
0
);
PixelXDimension = 960;
PixelYDimension = 720;
SceneCaptureType = 0;
};
"{TIFF}" = {
Orientation = 1;
ResolutionUnit = 2;
XResolution = 72;
YResolution = 72;
"_YCbCrPositioning" = 1;
};
}
library
является ALAssetsLibrary
экземпляр, а saveImage: toAlbum:
Метод из этого поста, только слегка измененный, чтобы я мог сохранить метаданные как таковые:
-(void)saveImage:(UIImage *)image toAlbum:(NSString *)albumName metadata:(NSDictionary *)metadata withCompletionBlock:(SaveImageCompletion)completionBlock
{
//write the image data to the assets library (camera roll)
[self writeImageToSavedPhotosAlbum:image.CGImage
metadata:metadata
completionBlock:^(NSURL* assetURL, NSError* error) {
//error handling
if (error!=nil) {
completionBlock(error);
return;
}
//add the asset to the custom photo album
[self addAssetURL: assetURL
toAlbum:albumName
withCompletionBlock:completionBlock];
}
];
}
Изображение исходит от UIImagePickerController
который использует камеру. Картинка успешно сохраняется в правильный альбом, просто отсутствуют метаданные.
Я делаю что-то не так в процессе сохранения / загрузки? Разве мне не разрешено сохранять собственные метаданные в изображение?
1 ответ
Я провел некоторое тестирование, и, насколько я могу судить, короткий ответ: "Вы не можете этого сделать". Похоже, что метаданные должны соответствовать определенным ключам метаданных EXIF. Вы можете посмотреть доступные ключи метаданных TIFF и посмотреть, есть ли какие-либо значения, которые вы хотите установить / перезаписать. Вы можете попробовать, например, используя kCGImagePropertyTIFFImageDescription
хранить ваши данные.
NSMutableDictionary *tiffDictionary= [[NSMutableDictionary alloc] init];
NSMutableDictionary *myMetadata = [[NSMutableDictionary alloc] init];
[tiffDictionary setObject:@"My Metadata" forKey:(NSString*)kCGImagePropertyTIFFImageDescription];
[myMetadata setObject:tiffDictionary forKey:(NSString*)kCGImagePropertyTIFFDictionary];
... и сохранить мои метаданные с изображением.
Другие ключи см. Здесь: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGImageProperties_Reference/Reference/reference.html.
В противном случае я хотел бы создать NSDictionary, который использует уникальный идентификатор изображения в качестве ключа, и сохранить объект метаданных в качестве значения. Сохранить / загрузить этот NSDictionary каждый раз, когда вы сохраняете / загружаете изображение.