1

使用下面的代码,我可以从图像中提取元数据(预先添加到我的项目中),并将信息呈现为文本。这正是我想做的。SYMetadata是通过 URL 指向图像来创建的。initWithAbsolutePathURL. 我想对 UIImage 或者正在加载到 UIImage 的图像做同样的事情。如何获取选择器选择的图像的 URL?或者我如何从这个传入的图像创建一个“资产”?

该文档描述了initWithAsset. 不过,还没有弄清楚如何使用它,或者这是否是实现我的目的的正确方法。非常感谢任何帮助。

NSURL *imageURL = [[NSBundle mainBundle] URLForResource:@"someImage" withExtension:@"jpg"];
SYMetadata *metadata = [[SYMetadata alloc] initWithAbsolutePathURL:imageURL];
[textView setText:[[metadata allMetadatas] description]];

注意:我尝试imageURL = [info valueForKey:@"UIImagePickerControllerReferenceURL"];在“pickerDidFinish”方法中添加这样的 NSURL,但是在我将此 URL 添加到上述代码后元数据为空。

4

2 回答 2

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 已经可以从原始数据中删除大部分元数据。您最好从用于创建 UIImage 的 NSData 获取元数据...

    - (NSDictionary*)metaDataFromData:(NSData*)data
{
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    CFDictionaryRef imageMetaData = CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
    return (__bridge NSDictionary *)(imageMetaData);
}
于 2013-02-02T18:19:56.540 回答
1

如果您有 ALAsset(在我的示例 _detailItem 中),您可以通过以下方式获取元数据:

NSDictionary *myMetadata = [[_detailItem defaultRepresentation] metadata];
于 2013-02-02T17:59:18.900 回答