CGImageDestination сохраняет цветовое пространство CMYK как RGB

У меня есть CGImage в цветовом пространстве CMYK (т.е. CGColorSpaceGetModel возвращает kCGColorSpaceModelCMYK при запросе через CGImageGetColorSpace).

Однако, когда я пытаюсь сохранить его через CGImageDestination, он преобразуется в RGBColorSpace. Я пытался установить правильные значения, но безрезультатно. Откуда я это знаю? Когда я открываю сохраненное изображение в режиме предварительного просмотра, на вкладке "Общая информация" отображается сообщение "ColorModel:RGB" и "Имя профиля: Общий профиль RGB". Если я открываю сохраненный файл с помощью CGImageSource и считываю свойства, я получаю те же результаты (цветовая модель RGB, общий профиль RGB).

Теперь, прежде чем я потеряю свои последние волосы (единственное), мой вопрос: это намеренно? ImageIO не способен сохранять изображения в любом формате, кроме RGB? Просто для удовольствия я попробовал то же самое с цветовым пространством L*a*b, и получил тот же результат.

Вот мой код сохранения:

BOOL saveImage(CGImageRef theImage, NSURL *fileDestination, NSString *theUTI) 
{

CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileDestination, (__bridge CFStringRef) theUTI, 1, nil);

// now assemble the dictionary for saving
NSMutableDictionary *theDict = nil;
theDict = [[NSMutableDictionary alloc] initWithCapacity:10];
[theDict setObject:[NSNumber numberWithFloat:hdpi] forKey: (id) kCGImagePropertyDPIHeight];
[theDict setObject:[NSNumber numberWithFloat:vdpi] forKey: (id) kCGImagePropertyDPIWidth];
}

// now make sure that we have the correct color space in the dictionary
NSString *colorModel = nil;
CGColorSpaceRef theColorSpace = CGImageGetColorSpace(theImage);
CGColorSpaceModel theModel = CGColorSpaceGetModel(theColorSpace);
switch (theModel) {
    case kCGColorSpaceModelRGB:
        colorModel = kCGImagePropertyColorModelRGB;
        break;

    case kCGColorSpaceModelLab:
        colorModel = kCGImagePropertyColorModelLab;
        break;

    case kCGColorSpaceModelCMYK:
        colorModel = kCGImagePropertyColorModelCMYK;
        break;

    default:
        colorModel = kCGImagePropertyColorModelRGB;
        break;
}
[theDict setObject:colorModel forKey:(id) kCGImagePropertyColorModel];

// Add the image to the destination, characterizing the image with
// the properties dictionary.
CGImageDestinationAddImage(imageDestination, theImage, (__bridge CFDictionaryRef) theDict); //properties);

BOOL success  = (CGImageDestinationFinalize(imageDestination) != 0);
CFRelease(imageDestination);
return success;
}

Там должно быть что-то очевидное, что я пропускаю. Должен ли я установить некоторые kCFSuperSecretProperty, чтобы заставить это работать? Или ImageIO просто не сохраняется как CMYK?

О, я на OSX 10.7 (Лев), если это фактор,

1 ответ

Решение

Хорошо, я укусил пулю и использовал инцидент, чтобы получить техническую помощь Apple. Вот их ответ:

Ответ состоит из двух частей:

1) ImageIO сохранит цветовое пространство CMYK и Lab, если формат файла для места назначения поддерживает это цветовое пространство. В настоящее время форматы изображений, поддерживающие CMYK, - это TIFF, PSD, JPEG и JPEG 2000. Если формат файла назначения не поддерживает текущее цветовое пространство, ImageIO преобразуется в стандартный профиль RGB. Это происходит, например, если вы собираетесь сохранить изображение CMYK в формате PNG или BMP.

2) ImageIO не поддерживает сохранение CMYK или Lab в JPEG 2000, хотя в спецификациях указано, что формат файла поддерживает CMYK и Lab. Apple Engineering признает, что это недостаток ImageIO. Это может быть изменено в будущем.

Итак, приведенный выше код верен. Вам придется самостоятельно отфильтровать типы файлов (UTI) или предупредить пользователя о скором преобразовании. В будущем, когда Apple добавит поддержку CMYK и Lab в JPEG 2000, вам придется изменить функцию фильтра, но код может остаться прежним.

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