无法使用自定义元数据保存图像
Posted
技术标签:
【中文标题】无法使用自定义元数据保存图像【英文标题】:Failure to save image with custom Metadata 【发布时间】:2012-11-01 03:10:32 【问题描述】:我正在尝试在我的 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:
方法来自this blog post,只是稍作修改,以便我可以这样保存元数据:
-(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];
...并将 myMetadata 与图像一起保存。
对于其他键,请参见: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGImageProperties_Reference/Reference/reference.html
否则,我要做的是创建一个使用图像的唯一标识符作为键的 NSDictionary,并将元数据对象存储为值。保存/加载图像时保存/加载此 NSDictionary。
【讨论】:
我保存的所有东西都只是一个NSString
,在这种情况下我需要创建一个自定义对象类吗?
@DanF 不,如果它们都是 NSStrings,你不需要遵守 NSCoding。我进行了几次测试,刚刚更新了我的答案。
不允许我保存我想要的键,但它允许我保存自定义数据,我可以保存一个可解析的字符串。至少我现在可以得到我想要的终极功能,谢谢。
顺便说一句-我没有尝试过,但是您可以将 NSString 替换为原始元数据 NSDictionary。值得一试!
不幸的是,我无法将数据保存为字典,只能保存为单个字符串。我猜元数据作者希望描述是一个字符串。谢天谢地,我的数据量有限,所以我可以将它编码成一个字符串,然后再解析它。我会尽快奖励赏金以上是关于无法使用自定义元数据保存图像的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法使用自定义单元格类设置 UITableViewCell 标签和图像!只能加载单元格样式的数据:字幕不是自定义的
获取 InvalidArgumentError:NewRandomAccessFile 在自定义图像数据集上使用 tf.data 时无法创建/打开