CGImageDestination将CMYK颜色空间保存为RGB

时间:2014-07-17 17:49:03

标签: cocoa cmyk cgimageref

我在CMYK颜色空间中有一个CGImage(即CGColorSpaceGetModel在通过CGImageGetColorSpace查询时返回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),如果这是一个因素,

1 个答案:

答案 0 :(得分:2)

好的,我咬了一口子并用事件来获得Apple的工程帮助。这是他们的答复:

答案分为两部分:

1)如果目标的文件格式支持该颜色空间,则ImageIO将保留CMYK和Lab颜色空间。目前,支持CMYK的图像格式为TIFF,PSD,JPEG和JPEG 2000.如果目标文件格式不支持当前色彩空间,ImageIO将转换为标准RGB配置文件。例如,如果您打算将CMYK图像保存为PNG或BMP文件格式

,就会发生这种情况

2)即使规范声明文件格式支持CMYK和Lab,ImageIO也支持将CMYK或Lab保存到JPEG 2000。 Apple Engineering承认这是目前ImageIO的一个缺点。这可能会在将来改变。

因此,上面的代码是正确的。您必须自己过滤文件目标类型(UTI)或警告用户即将进行转换。将来,当Apple为JPEG 2000添加CMYK和Lab支持时,您必须更改过滤器功能,但代码可以保持不变。