我想删除图像的一些元数据,有时是所有元数据,而不会丢失质量。我尝试将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中删除元数据?