У меня есть 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), если это имеет значение,