为什么Windows / OS X上的颜色显示不同?

我们正在将应用程序从Windows移植到Mac OS,并且在两个平台上颜色的显示都是不同的。 这是一个例子:

神秘的色彩差异

在这种情况下,我们告诉应用程序使用绿色0,140,​​0和蓝色25,0,75。 在Windows上,这很好(顶部图片)。 在Mac上,显然OS X决定“重新解释”颜色并以不同的方式显示(底部图像)。

我们能做些什么来告诉操作系统停止使用我们的颜色定义进行创意吗? 如果Mac可以任意改变我们的颜色定义〜10%,那么在两个平台上看起来都很不错。

编辑:下面是我们用来设置上面使用的蓝色的代码的示例:

m_colour = CGColorCreateGenericRGB(25 / 255.0, //r 0 / 255.0, //g 75 / 255.0, //b 1.0); //a 

谢谢。

Mac使用称为ColorSync的复杂色彩空间系统来确保不同设备上的色彩显示完全相同。 因此,RGB空间中的颜色有时可能会略有偏移,以便在正确校准的显示器,打印机等上显示与人眼相同的颜色。

如果您向我们展示您用来生成绿色阴影的代码,我们可以告诉您如何修改它以避免此颜色校正。 但是,除非有一个迫切的理由,为什么要避免它,通常情况下最好让它发生,因为你没有广泛的显示模型来测试。

编辑: CGColorCreateGenericRGB()在通用RGB色彩空间中创建一个颜色,所以它将根据您的显示器校准而略微移动。 不幸的是,现在已经不可能(从Mac OS X 10.4开始)创建一个依赖于设备的CGColor实例(因此不需要进行校准)。然而,您可以在颜色空间创建一个CGColor目标绘图上下文 – 这将告诉石英,没有转换是必要的。

如果您自己创建了上下文,则应该保留对您使用的颜色空间的引用( CGColorSpaceRef类型)。如果它处于Cocoa级别(例如由-[NSImage lockFocus]创建的上下文或由-[NSView drawRect:]那么你应该使用相关的NSColor API而不是CGColor API(即+[NSColor colorWithDeviceRed:green:blue:alpha:] 。)

如果您必须使用Quartz绘图,则可以调用CGContextSetRenderingIntent()来告诉上下文如何转换颜色,但不能保证转换不会发生。