0

我扩展 NSColor 以添加类方法

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

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

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

当我运行程序时,日志行是"Color=37854F". 但是,我使用 PixelStick 工具来丢弃颜色像素,像素颜色不是37854F,颜色分量比它的原点小一点。

有没有人知道解决方案?

4

2 回答 2

2

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

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

值得注意的是:当您在 OSX 上的设计中使用您的颜色(无论是浏览器中的图像或 PDF 文件或其他任何内容)并在虚拟机(例如 Parallels Desktop 中)的 Windows 应用程序中使用其组件值时,您可以重现任何屏幕颜色选择器显示的确切颜色。

[更新]:由于将系统颜色配置文件设置为通用颜色配置可以解决颜色匹配问题,因此可能值得考虑在代码中创建自己的通用颜色空间,如本技术问答中所述

[更新]:我刚刚发现另一个 NSColor 消息,看起来是我们都在寻找的:

NSColor colorWithSRGBRed:green:blue:alpha

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

于 2013-04-11T07:13:36.057 回答
0

这是您使用精确屏幕颜色(Swift 3)初始化 NSColor 的方式:

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

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

如果您对屏幕截图进行颜色选择,您可以确认 RGB 组件完全匹配。

于 2017-05-12T02:34:48.677 回答