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

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

Однако, когда я пытаюсь сохранить его через CGImageDestination, он преобразуется в RGBColorSpace. Я пытался установить правильные словарные значения, но безрезультатно. Откуда я это знаю? Когда я открываю сохраненное изображение с помощью предварительного просмотра, на вкладке «Общая информация» отображается «Модель цвета: 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 (Lion), если это имеет значение,


person cfx Chris    schedule 17.07.2014    source источник


Ответы (1)


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

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

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

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

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

person cfx Chris    schedule 29.07.2014