我正在尝试获取由触摸位置确定的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模型,它不受光照的影响,因此颜色应该并看起来在运行时是一致的。
发布于 2018-12-13 00:48:41
嗯,这比我想象的要容易。我首先调整了一些东西,比如让触摸在我的场景中注册:
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]我不确定为什么我要做最后一部分,所以任何对此的见解都将不胜感激!
https://stackoverflow.com/questions/53746664
复制相似问题