我在 CMYK 颜色空间中有一个 CGImage(即,当通过 CGImageGetColorSpace 查询时,CGColorSpaceGetModel 返回 kCGColorSpaceModelCMYK)。
但是,当我尝试通过 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 (Lion) 上,