准确地从屏幕像素中获取颜色并转换其颜色空间

3

我需要从屏幕上的像素中获取颜色并转换其颜色空间。我的问题是,当将这些值与Digital Color Meter应用程序进行比较时,它们的颜色值不同。

// create a 1x1 image at the mouse position
if let image:CGImage = CGDisplayCreateImage(disID, rect: CGRect(x: x, y: y, width: 1, height: 1))
{
    let bitmap = NSBitmapImageRep(cgImage: image)

    // get the color from the bitmap and convert its colorspace to sRGB
    var color = bitmap.colorAt(x: 0, y: 0)!
    color     = color.usingColorSpace(.sRGB)!

    // print the RGB values
    let red = color.redComponent, green = color.greenComponent, blue = color.blueComponent
    print("r:", Int(red * 255), " g:", Int(green * 255), " b:", Int(blue * 255))
}

我的代码(转换为sRGB):255, 38, 0
数字色彩计(sRGB):255, 4, 0 如何从屏幕上的像素获取具有正确颜色空间值的颜色? 更新: 如果您不将颜色空间转换为任何内容(或将其转换为calibratedRGB),则在Digital Color Meter设置为“显示本地值”时,值与Digital Color Meters值匹配。 我的代码(未转换):255, 0, 1
数字色彩计(设置为:显示本地值):255, 0, 1 那么,当颜色值与DCM应用程序中的本机值匹配时,将颜色转换为sRGB并将其与DCM的值(在sRGB中)进行比较时,为什么它们不匹配?我还尝试将其转换为其他颜色空间,但始终与DCM中的值不同。

有一件事需要注意并尝试,虽然我不知道最终结果是否会有所不同:有一个AppKit函数可以在不创建图像的情况下读取像素的颜色值。它是NSReadPixel() - Ken Thomases
不幸的是,这仅适用于您自己应用程序窗口内部,而不是整个显示器。 - fuzzyCap
尝试在不将“color”转换为DCM的本机值的情况下比较其组件值。也许由于某种原因,您的代码和DCM正在从原始像素值进行不同的转换。 - CRD
1个回答

3

好的,我可以告诉你如何修复/匹配DCM,但你需要决定这是否正确/是一个错误等。

看起来colorAt()返回的颜色与位图像素具有相同的组件值,但具有不同的颜色空间 - 它不是原始设备颜色空间,而是通用RGB颜色空间。我们可以通过在位图空间中构建一个颜色来“纠正”这个问题:

let color = bitmap.colorAt(x: 0, y: 0)!

// need a pointer to a C-style array of CGFloat
let compCount = color.numberOfComponents
let comps = UnsafeMutablePointer<CGFloat>.allocate(capacity: compCount)
// get the components
color.getComponents(comps)
// construct a new color in the device/bitmap space with the same components
let correctedColor = NSColor(colorSpace: bitmap.colorSpace,
                             components: comps,
                             count: compCount)
// convert to sRGB
let sRGBcolor = correctedColor.usingColorSpace(.sRGB)!

我认为你会发现correctedColor的值跟DCM本地值一致,而sRGBcolor的值则跟DCM的sRGB值一致。

请注意,我们正在设备空间中构建一种颜色,而不是将一种颜色转换为设备空间。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接