Удалить метаданные

#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 ‘s dataWithBytesNoCopy:length:freeWhenDone: означает, что им не нужно балансировать malloc() вызов с явным free() вызовом самим; скорее, когда imageData переменная освобождена, она обрабатывает вызов malloc() .