Цвет пикселя в ARSCNView - PullRequest
       68

Цвет пикселя в ARSCNView

0 голосов
/ 12 декабря 2018

Я пытаюсь получить цвет пикселя в 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 и смотрит нацвет, который они фактически производят, дает совершенно другой цвет (темно-синий в случае оранжевого).

Я предполагаю, что, возможно, системы координат разные, и я на самом деле получаю другую точку на изображении, возможно?

РЕДАКТИРОВАТЬ: Кроме того, я должен упомянуть, что часть, которую я касаюсь, является трехмерной моделью, на которую не влияет освещение, поэтому цвет должен быть и, по-видимому, постоянным во время выполнения.

1 Ответ

0 голосов
/ 12 декабря 2018

Ну, это было проще, чем я думал.Сначала я настроил некоторые вещи, такие как сделать так, чтобы касание было зарегистрировано в моем просмотре сцены:

 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]

Я не уверен, почему мне пришлось делать эту последнюю часть, поэтому любое понимание этого будет оценено!

...