以编程方式更改显示器的颜色“配置文件”

问题描述 投票:0回答:1

是否有 API 可以通过编程方式设置并恢复显示器的颜色“配置文件”?

我已经搜索了 CoreGraphics 以及无关紧要的 ColorSync,并且只能看到检索方法(例如 CGDisplayCopyColorSpace)。用于设置显示的 CG 功能似乎与定位和伽玛等有关,但与颜色配置文件管理无关。

注意堆栈编辑器:这确实是一个编程问题,而不是一个关于通用计算的问题。我希望在 Swift 中执行此操作,作为用户可执行文件的一部分。无需关闭此功能。

目标

准确采样 sRGB 像素值,即使显示器“配置文件”不是 sRGB

观察到的行为

应用程序可以设置自己的颜色环境。根据采样窗口,捕获的 CGImage 中的原始 BGRA 值可能已经是 sRGB 值 - 或者需要转换。

您可以在 Apple 的数字色度计或任何颜色选择器中进行测试。 Apple 准确反映了 CGImage 捕获 BGRA 原始像素值。

尝试从 Google 的十六进制预览搜索结果中采样样本。

Monitor in sRGB profile

  • Firefox — “native”和“sRGB”采样模式下的值是准确的
  • Safari — 同上

Monitor in any other color profile

  • Firefox —“Native”(原始 CGImage BGRA 值)是准确的 sRGB 值,但“sRGB”模式值不准确
  • Safari — 在任一采样模式下,值大多不准确,具体取决于颜色

准确检索屏幕盖 RGB 值需要 (a) 设置显示配置文件(这是已知的先决条件)或 (b) 特定于窗口的颜色空间知识以进行适当的转换。

swift macos core-graphics
1个回答
0
投票

ColorSyncDeviceSetCustomProfiles 就是您正在寻找的。

这是一个用于设置/重置

NSScreen
颜色配置文件的工作片段:

import ColorSync

let DEVICE_CLASS = kColorSyncDisplayDeviceClass.takeUnretainedValue()
let DEFAULT_PROFILE = kColorSyncDeviceDefaultProfileID.takeUnretainedValue()

extension NSScreen {
    var displayID: CGDirectDisplayID {
        deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as! CGDirectDisplayID
    }
    var cfUUID: CFUUID {
        CGDisplayCreateUUIDFromDisplayID(displayID)!.takeRetainedValue()
    }
}

let RESET_PROFILE_DICT = [DEFAULT_PROFILE: nil] as CFDictionary
ColorSyncDeviceSetCustomProfiles(DEVICE_CLASS, NSScreen.main!.cfUUID, RESET_PROFILE_DICT)

let CUSTOM_PROFILE_DICT = [DEFAULT_PROFILE: URL(fileURLWithPath: "/tmp/ColorProfile.icc")] as CFDictionary
ColorSyncDeviceSetCustomProfiles(DEVICE_CLASS, NSScreen.main!.cfUUID, CUSTOM_PROFILE_DICT)

为了方便起见,我还在这里提供了用于设置颜色配置文件的源代码和已编译的二进制文件:alin23/mac-utils - ApplyColorProfile

© www.soinside.com 2019 - 2024. All rights reserved.