NSColor在屏幕上显示不同的颜色

时间:2013-04-11 01:14:54

标签: macos cocoa

我扩展NSColor以添加类方法

+ (NSColor*) initWithHTMLString: (NSString*) rgb

我为NSWindow对象设置了背景颜色:

[self.window setBackgroundColor:[NSColor initWithHTMLString:@"37854F"]]
NSLog(@"Color=%@",[self.window.backgroundColor toHTMLRGB]);

运行程序时,日志行为"Color=37854F"。但是,我使用PixelStick工具删除颜色像素,像素颜色不是37854F,颜色分量比原点小。

有没有人知道解决方案?

2 个答案:

答案 0 :(得分:2)

区别的原因是使用obj-c创建的颜色被调整为考虑当前颜色配置文件(请参阅系统首选项 - >监视器 - >颜色)。到目前为止,当您有多个监视器并将正在运行的应用程序从一个监视器拖到另一个监视器时,相同的颜色会有所不同。不幸的是,即使你使用colorWithDeviceRed,在特定的显示器上使用确切的颜色也是非常困难的:绿色:蓝色:Alpha代替colorWithCalibratedRed:绿色:蓝色:Alpha。

色彩感知是一个复杂的问题,各种输出设备都发挥着重要作用,因此难怪没有1:1的映射。但它应该可以创建一种颜色(例如在绘画应用程序或颜色管理应用程序,设计师应用程序等),并在Cocoa中重新创建完全相同的颜色,如果两者都在同一台显示器上运行。

有趣的是:在OSX上的设计中有颜色(无论是浏览器中的图像还是PDF文件或其他),并在虚拟机的Windows应用程序中使用其组件值(例如在Parallels中)桌面)你可以像任何屏幕颜色选择器一样重现精确的颜色。

[更新]:由于将系统颜色配置文件设置为通用颜色配置文件可以解决颜色匹配问题,因此可能需要考虑在代码中创建自己的通用颜色空间,如technical Q&A

中所述

[更新]:我刚刚发现了另一张看起来像我们都在寻找的NSColor消息:

NSColor colorWithSRGBRed:green:blue:alpha

在一些测试中,我可以看到颜色是准确的。不幸的是,此消息仅在10.7及更高版本上可用。

答案 1 :(得分:0)

这是您使用精确屏幕颜色(Swift 3)启动NSColor的方法:

let components = [red, green, blue, alpha]

let color = NSColor(
    colorSpace: NSScreen.main()!.colorSpace!, 
    components: components,
    count: 4)

如果您选择一个屏幕截图,则可以确认RGB组件是否完全匹配。