Не удалось сохранить изображение с пользовательскими метаданными

Я пытаюсь создать собственную галерею изображений в своем приложении для iOS. Я хотел бы позволить пользователю иметь возможность сохранять определенные метаданные с изображением, чтобы впоследствии их можно было найти в приложении с прикрепленной информацией.

Во-первых, когда пользователь делает снимок, приложение сохраняет изображение в пользовательский альбом для приложения:

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

При сохранении я получаю следующее сообщение:

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

Затем, когда я пытаюсь получить изображения позже, я использую эту функцию

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

library является ALAssetsLibrary экземпляр, а saveImage: toAlbum: Метод из этого поста, только слегка измененный, чтобы я мог сохранить метаданные как таковые:

-(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 который использует камеру. Картинка успешно сохраняется в правильный альбом, просто отсутствуют метаданные.

Я делаю что-то не так в процессе сохранения / загрузки? Разве мне не разрешено сохранять собственные метаданные в изображение?

1 ответ

Решение

Я провел некоторое тестирование, и, насколько я могу судить, короткий ответ: "Вы не можете этого сделать". Похоже, что метаданные должны соответствовать определенным ключам метаданных 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];

... и сохранить мои метаданные с изображением.

Другие ключи см. Здесь: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGImageProperties_Reference/Reference/reference.html.

В противном случае я хотел бы создать NSDictionary, который использует уникальный идентификатор изображения в качестве ключа, и сохранить объект метаданных в качестве значения. Сохранить / загрузить этот NSDictionary каждый раз, когда вы сохраняете / загружаете изображение.

Другие вопросы по тегам