2012-11-12 3 views
1

iOS 앱에서 맞춤 이미지 갤러리를 만들려고합니다. 사용자가 첨부 된 정보로 나중에 앱에서 끌어 올 수 있도록 특정 메타 데이터를 이미지와 함께 저장할 수있게하고 싶습니다.맞춤 메타 데이터로 이미지를 저장하지 못했습니다.

사용자가 사진을 촬영 할 때

먼저, 앱이 앱의 사용자 정의 앨범에 이미지를 저장 : 다음

Saving image with metadata: { 
    Event = t; 
    Person = "George James"; 
    PictureName = tt; 
} 

: 나는 다음과 같은 로그 메시지가 저장되면

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]; 
}]; 

나중에 이미지를 검색 할 때이 함수를 사용합니다.

-(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; 
    }; 
} 

libraryALAssetsLibrary 예이고, 나는 같은 메타 데이터를 저장할 수 있도록 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에서 나옵니다. 그림이 메타 데이터가 누락 된 올바른 앨범에 성공적으로 저장됩니다.

저장 /로드 프로세스에 문제가 있습니까? 실제로 사용자 지정 메타 데이터를 이미지에 저장할 수 있습니까?

답변

5

나는 약간의 테스트를했는데, 내가 알 수있는 바로는 짧은 대답은 '할 수 없다'입니다. 메타 데이터가 특정 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를 저장 /로드하십시오.

+0

내가 저장하는 것은 모두 'NSString'뿐입니다.이 경우 맞춤 개체 클래스를 만들어야합니까? –

+0

@DanF 아니요, 모두 NSString 인 경우 NSCoding을 준수 할 필요가 없습니다. 몇 가지 테스트를 실행하고 방금 내 대답을 업데이트했습니다. –

+0

내가 원하는 키를 저장할 수 없지만 사용자 정의 데이터를 저장할 수 있도록 허용하며, 해석 할 수있는 문자열을 저장할 수 있습니다. 적어도 지금 내가 원하는 최고의 기능을 얻을 수 있습니다. 감사합니다. –