删除元数据

时间:2014-07-06 14:59:33

标签: objective-c metadata cgimage

我想删除图像的一些元数据,有时是所有元数据,而不会丢失质量。我尝试将kCFNull[NSNull null]作为字典中的值传递。我还试图完全删除一些键/值对。然而,我删除的一切都神奇地返回。这是我成功用于修改值的代码:

- (NSData *)dataForImageAsset:(ALAsset *)asset withMetadata:(NSDictionary *)metadata {
    ALAssetRepresentation *rep = [asset defaultRepresentation];
    Byte *buffer = (Byte *)malloc((long)rep.size);
    NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil];
    NSData *imageData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
    CFStringRef imageType = CGImageSourceGetType(source);

    NSMutableData *resultData = [NSMutableData data];
    CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL);

    CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)metadata);
    BOOL success = CGImageDestinationFinalize(imgDest);

    CFRelease(imgDest);
    CFRelease(source);

    if (success) {
        return resultData;
    }
    return nil;
}

// // EDIT

当我将元数据设置为仅包含键{Exif}和{TIFF}的空字符串的字典时,会引发以下异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x3f9c0'

这意味着CGImageDestinationAddImageFromSource不会使用我的元数据来覆盖整个事物。它只是覆盖现有字段的值。如果没有值,则不会覆盖现有值。

我可以为我要删除的所有字段设置一个无意义的值,但实际上我不希望键显示出来。转换为PNG或JPEG不是一种选择,因为我想保持原始质量。

我有意使用- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock创建新的ALAsset,但元数据问题仍然存在。

有没有办法从raw imageData中删除元数据?

0 个答案:

没有答案