ARSCNView中像素的颜色



我正在尝试获取由触摸位置确定的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模型,因此颜色在运行时应该并且看起来是一致的。

这比我想象的要容易。我首先调整了一些事情,比如在我的场景视图中注册触摸:

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]

我不知道为什么我必须做最后一部分,所以任何对此的见解都将不胜感激!

相关内容

  • 没有找到相关文章

最新更新