ARSCNView中像素的颜色

时间:2018-12-12 15:50:10

标签: swift uiimage arkit arscnview sceneview

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

1 个答案:

答案 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]

我不确定为什么我必须做最后一部分,所以对此有任何见识将不胜感激!