从(到)“挑选”的图像获取URL,iOS

时间:2013-02-02 17:47:26

标签: ios url uiimagepickercontroller

使用下面的代码,我可以从图像中提取元数据(预先添加到我的项目中),并将信息呈现为文本。这正是我想要做的。通过URL指向图像来创建SYMetadatainitWithAbsolutePathURL。我想用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添加到上述代码后,元数据为空。

2 个答案:

答案 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];