Я пытаюсь получить цвет пикселя в 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 и смотрит нацвет, который они фактически производят, дает совершенно другой цвет (темно-синий в случае оранжевого).
Я предполагаю, что, возможно, системы координат разные, и я на самом деле получаю другую точку на изображении, возможно?
РЕДАКТИРОВАТЬ: Кроме того, я должен упомянуть, что часть, которую я касаюсь, является трехмерной моделью, на которую не влияет освещение, поэтому цвет должен быть и, по-видимому, постоянным во время выполнения.