#objective-c #metadata #cgimage
#objective-c #метаданные #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;
}
// РЕДАКТИРОВАТЬ//
Когда я устанавливаю метаданные в словарь, который содержит только пустые строки для ключей {Exif} и {TIFF}, возникает следующее исключение:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x3f9c0'
Это означает, что CGImageDestinationAddImageFromSource
не использует мои метаданные для полной перезаписи. Это просто перезаписывает значения существующих полей. Если значения нет, существующее значение не перезаписывается.
Я мог бы просто установить бессмысленное значение для всех полей, которые я хочу удалить, но на самом деле я не хочу, чтобы ключи отображались. Конвертировать в PNG или JPEG не вариант, так как я хочу сохранить исходное качество.
У меня была идея создать новый ALAsset, используя - (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
но проблема с метаданными сохраняется.
Есть ли какой-либо способ удалить метаданные из необработанных ImageData?
Комментарии:
1. пока не уверен, почему. Однако всякий раз, когда вы вызываете malloc, вам нужно вызывать free. освободить (буфер);
2. Передача
YES
дляfreeWhenDone:
параметраNSData
‘sdataWithBytesNoCopy:length:freeWhenDone:
означает, что им не нужно балансироватьmalloc()
вызов с явнымfree()
вызовом самим; скорее, когдаimageData
переменная освобождена, она обрабатывает вызовmalloc()
.