【发布时间】: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