0

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

4

1 回答 1

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]

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

于 2018-12-12T16:48:41.257 回答