我试图获取由触摸位置确定的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模型,因此颜色在运行时应该并且看起来是一致的。
答案 0 :(得分:0)
嗯,这比我想象的要容易。我首先调整了一些方法,例如使触摸在我的场景视图中注册:
let loc:CGPoint = touch.location(in: sceneView)
然后,通过执行以下操作,我将cgpoint重新配比以适应图像视图:
let image = sceneView.snapshot()
let x = image.size.width / sceneView.frame.size.width
let y = image.size.height / sceneView.frame.size.height
guard let color = image[Int(x * loc.x), Int(y * loc.y)] else{
return
}
这最终使我具有一致的rgb值(不仅是每次触摸都会改变的数字,即使我使用的是同一颜色)。但是这些值仍然没有。由于某种原因,我返回的数组是反向的,所以我用:
let b = data![pixelData]
let g = data![pixelData + 1]
let r = data![pixelData + 2]
我不确定为什么我必须做最后一部分,所以对此有任何见识将不胜感激!