【问题标题】:Color of pixel in ARSCNViewARSCNView 中像素的颜色
【发布时间】:2018-12-12 15:50:10
【问题描述】:

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

【问题讨论】:

    标签: swift uiimage arkit arscnview sceneview


    【解决方案1】:

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

     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]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2013-05-07
      • 2019-07-27
      • 2019-07-24
      相关资源
      最近更新 更多