我正在尝试获取由触摸位置确定的 CGPoint 处的像素颜色。我尝试了以下代码,但颜色值不正确。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = event?.allTouches?.first {
let loc:CGPoint = touch.location(in: touch.view)
// in debugger, the image is correct
let image = sceneView.snapshot()
guard let color = image[Int(loc.x), Int(loc.y)] else{
return
}
print(color)
}
}
....
extension UIImage {
subscript (x: Int, y: Int) -> [UInt8]? {
if x < 0 || x > Int(size.width) || y < 0 || y > Int(size.height) {
return nil
}
let provider = self.cgImage!.dataProvider
let providerData = provider!.data
let data = CFDataGetBytePtr(providerData)
let numberOfComponents = 4
let pixelData = ((Int(size.width) * y) + x) * numberOfComponents
let r = data![pixelData]
let g = data![pixelData + 1]
let b = data![pixelData + 2]
return [r, g, b]
}
}
运行此程序并触摸屏幕上一个非常大且一致的亮橙色点会产生广泛的 RGB 值,然后查看它们实际产生的颜色会产生完全不同的颜色(橙色的情况下为深蓝色)。
我猜可能坐标系不同,我实际上可能在图像上得到不同的点?
编辑:另外我应该提到我正在点击的部分是一个不受照明影响的 3D 模型,因此颜色应该并且在运行时看起来是一致的。