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 を上記のコードに追加した後、メタデータは null です。

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 に答える