PixelWriten canvas не будет отображаться на экране - PullRequest
0 голосов
/ 02 июля 2019

У меня есть intArray для целых чисел, соответствующих пиксельным значениям RGB, и я пытаюсь записать их в изображение, которое я затем добавляю на холст, отображаемый в виде.Я следовал руководству по JavaFX docs для использования pixelWriter, и я знаю, что мой синтаксис для добавления холста в представление правильный, потому что я сделал то же самое в другом месте моего приложения и протестировал правильное размещение другого холста здесь.

Я пробовал контекстный способ: Просмотреть класс:

vbox(20.0, Pos.BOTTOM_CENTER) {
    if (controller.t > 100) { //same results with or without this
        label("IR camera view title")
        children.add(controller.rPiSensors.canvasIR)
    }
}

Класс модели:

val canvasIR = Canvas(lIR_WIDTH_RES.toDouble(), lIR_HEIGHT_RES.toDouble())
val gc: GraphicsContext = canvasIR.graphicsContext2D
var lIRPixelWriter = gc.pixelWriter


for (y in 0 until  32) {
    for (x in 0 until 24) {
        lIRPixelWriter.setPixels(0,0,lIR_WIDTH_RES,lIR_HEIGHT_RES, PixelFormat.getIntArgbInstance(), lIRHeatMapPixelInts, 0 , lIR_WIDTH_RES)
     }
}

Я также попробовал способ WritableImage, как упомянуто в этомSO post Создание образа Javafx из массива int :

Просмотр класса:

vbox(20.0, Pos.BOTTOM_CENTER) {
    if (controller.t > 100) { //same results with or without this
        label("IR camera view title")
        //tested this too controller.rPiSensors.imageView.show()
        children.add(controller.rPiSensors.imageView)
    }
}

Класс модели:

var lIRHeatMapPixelInts = IntArray(768) //24*32
//write to this in calculateIRPixelHelper below

var lIRHeatImage = WritableImage(lIR_WIDTH_RES, lIR_HEIGHT_RES)
var lIRPixelWriter = lIRHeatImage.pixelWriter
val imageView = ImageView(lIRHeatImage)

for (y in 0 until  32) {
    for (x in 0 until 24) {
        lIRPixelWriter.setPixels(0,0,lIR_WIDTH_RES,lIR_HEIGHT_RES, PixelFormat.getIntArgbInstance(), lIRHeatMapPixelInts, 0 , lIR_WIDTH_RES)
     }
}

Функция для полученияIR RGBInt от значения температуры с плавающей запятой (показано, что он корректен для RasPi, который получает данные, и я сравнил полученные данные с данными RasPi snet)

fun calculateIRPixelHelper(x : Int, y : Int, v : Float) {
    //float color[NUM_COLORS][3] = { {0;0;0}; {0;0;1}; {0;1;0}; {1,1,0},{1,0,0}, {1,0,1}, {1,1,1} }
    val color : Array<FloatArray> = arrayOf(floatArrayOf(0.0f,0.0f,0.0f), floatArrayOf(0.0f,0.0f,1.0f), floatArrayOf(0.0f,1.0f,0.0f), floatArrayOf(1.0f,1.0f,0.0f), floatArrayOf(1.0f,0.0f,0.0f), floatArrayOf(1.0f,0.0f,1.0f), floatArrayOf(1.0f,1.0f,1.0f))
    var outputV = v
    val idx1 : Int
    val idx2 : Int
    var fractBetween = 0.0f
    val vmin = 5.0f
    val vmax = 50.0f
    val vrange = vmax-vmin
    outputV -= vmin
    outputV /= vrange
    val ir : Int
    val ig : Int
    val ib : Int
    val pixelRGBInt : Int
    if (outputV <= 0) {
        idx1= 0
        idx2= 0
    } else if (outputV >= 1) {
        idx1 = (NUM_COLORS-1)
        idx2 = (NUM_COLORS-1)
    } else {
        outputV *= (NUM_COLORS-1)
        idx1 = truncate(outputV).toInt()
        idx2 = idx1+1
        fractBetween = outputV - idx1
    }

    ir = ((((color[idx2][0] - color[idx1][0]) * fractBetween) + color[idx1][0]) * 255.0).toInt()
    ig = ((((color[idx2][1] - color[idx1][1]) * fractBetween) + color[idx1][1]) * 255.0).toInt()
    ib = ((((color[idx2][2] - color[idx1][2]) * fractBetween) + color[idx1] [2]) * 255.0).toInt()
    pixelRGBInt = (ir shl 16) or (ig shl 8) or ib


    for(py  in 0 until IMAGE_SCALE) {
        for(px in 0 until IMAGE_SCALE) {
            lIRHeatMapPixelInts[x + px + IMAGE_SCALE*(y + py)] = pixelRGBInt
        }
    }
}

Вот значения температуры с плавающей запятой

пикселей, которые равны 0 за пределами первого ~ 50

И часть списка значений, сохраненных на холсте

Для первого метода на холсте написано 133K грязных битов, и когда я использую отладчик, кажется, что PixelWriter.setPixels записывает биты почти при каждом вызове, но медленно прогрессирует в увеличении значений (тенденцияпримерно так: напишите val pos = 12, 30, 62, 12, 30, 62, 78, 99, 10... Я могу скопировать точные цифры, если это подозревается в проблеме)

В обоих случаях я думал, что проблема заключалась в обновлении холста после его заполнения, но я исключил эту теорию, только добавивхолст, если в моделях установлен флаг - все равно ничего не появляется, кроме названия холста.

Я потратил целый рабочий день на то, чтобы попытаться показать это, любая помощь будет СЛАВНО признательна:)

1 Ответ

0 голосов
/ 03 июля 2019

Альфа-биты установлены на ноль, для непрозрачного пикселя необходимо установить их в старших битах pixelRGBint на ненулевое значение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...