gpt4 book ai didi

swift - 从屏幕上的像素准确获取颜色并转换其颜色空间

转载 作者:可可西里 更新时间:2023-11-01 02:00:16 24 4
gpt4 key购买 nike

我需要从屏幕上的像素获取颜色并转换其颜色空间。我遇到的问题是,在将值与 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

如何使用正确的色彩空间值从屏幕上的像素获取颜色?


更新:

如果您不将颜色色彩空间转换为任何东西(或将其转换为校准的 RGB),则当设置为“显示原始值”时,这些值与数字色度计的值相匹配。

我的代码(未转换):255, 0, 1
数字色度计(设置为:显示原始值):255, 0, 1

那么为什么当颜色值与 DCM 应用程序中的原生值匹配时,将颜色转换为 sRGB 并将其与 DCM 的值(在 sRGB 中)进行比较却不匹配?我也尝试过转换为其他色彩空间,但总是与 DCM 不同。

最佳答案

好的,我可以告诉你如何修复它/匹配 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 值。

请注意,我们是在设备空间构造一种颜色,而不是一种颜色转换到设备空间。

HTH

关于swift - 从屏幕上的像素准确获取颜色并转换其颜色空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46961761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com