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, вам придется изменить функцию фильтра, но код может остаться прежним.