使用下面的代码,我可以从图像中提取元数据(预先添加到我的项目中),并将信息呈现为文本。这正是我想要做的。通过URL指向图像来创建SYMetadata
。 initWithAbsolutePathURL
。我想用UIImage或者正在加载到UIImage的图像做同样的事情。如何获取选择器选择的图像的URL?或者如何从此传入图像创建“资产”?
该文档描述了initWithAsset
。但是还没弄明白如何使用它,或者这是否是正确的方法。任何帮助非常感谢。
NSURL *imageURL = [[NSBundle mainBundle] URLForResource:@"someImage" withExtension:@"jpg"];
SYMetadata *metadata = [[SYMetadata alloc] initWithAbsolutePathURL:imageURL];
[textView setText:[[metadata allMetadatas] description]];
注意:我尝试在“pickerDidFinish”方法中添加类似此imageURL = [info valueForKey:@"UIImagePickerControllerReferenceURL"];
的NSURL,但在将此URL添加到上述代码后,元数据为空。
答案 0 :(得分:2)
如果您使用的是imagePickerController,则委托方法将为您提供所需的内容
- (void) imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
if ([[info allKeys] containsObject:UIImagePickerControllerReferenceURL]){
// you will get this key if your image comes from a library
[self setMetaDataFromAssetLibrary:info];
} else if ([[info allKeys] containsObject:UIImagePickerControllerMediaMetadata]){
// if the image comes from the camera you get the metadata in it's own key
self.rawMetaData = [self metaDataFromCamera:info];
}
}
从资源库 - 请记住,完成并有一个异步完成块需要时间,因此您可能需要添加一个完成标志,以确保在更新之前不访问该属性。
- (void) setMetaDataFromAssetLibrary:(NSDictionary*)info
{
NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
resultBlock:^(ALAsset *asset) {
self.rawMetaData = asset.defaultRepresentation.metadata;
}
failureBlock:^(NSError *error) {
NSLog (@"error %@",error);
}];
}
来自相机:
- (NSDictionary*)metaDataFromCamera:(NSDictionary*)info
{
NSMutableDictionary *imageMetadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
return imageMetadata;
}
以下是如何从UIImage获取元数据
- (NSDictionary*)metaDataFromImage:(UIImage*)image
{
NSData *jpegData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)];
return [self metaDataFromData:jpegData];
}
但要小心 - 一个UIImage已经从原版中删除了很多元数据..你最好从NSData中获取用于创建UIImage的元数据...
- (NSDictionary*)metaDataFromData:(NSData*)data
{
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
CFDictionaryRef imageMetaData = CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
return (__bridge NSDictionary *)(imageMetaData);
}
答案 1 :(得分:1)
如果你有一个ALAsset(在我的示例_detailItem中),你可以用这种方式获得元数据:
NSDictionary *myMetadata = [[_detailItem defaultRepresentation] metadata];