Saya ingin menampilkan WritableImage dalam tampilan gambar, tetapi saya ingin gambar itu berubah ketika pengguna memuat file baru dari browser file. Saya tahu bahwa ada fungsi bind() untuk string yang berubah seiring waktu, tetapi saya tidak dapat menemukan opsi serupa untuk gambar. Saya dapat memecahkan masalah untuk gambar yang ukurannya sama dengan yang dimuat secara default (dengan menulis melalui piksel), tetapi itu hanya berfungsi jika ukurannya sama, karena saya tidak dapat mengubah ukuran gambar yang saya tampilkan. Kode Kotlin saya sejauh ini:

class PhotoView : View("Preview") {

val mainController: mainController by inject()

override val root = hbox {
    imageview{
        image = mainController.moddedImg
    }
    hboxConstraints {
        prefWidth = 1000.0
        prefHeight = 1000.0
    }
}


class ControlView: View(){

val mainController: mainController by inject()

override val root = hbox{
    label("Controls")
    button("Make BW!"){
        action{
            mainController.makeBW()
        }
    }
    button("Choose file"){
        action{
            mainController.setImage()
            mainController.update()
        }
    }

}
}

class mainController: Controller() {

private val ef = arrayOf(FileChooser.ExtensionFilter("Image files (*.png, *.jpg)", "*.png", "*.jpg"))
private var sourceImg=Image("pic.png")
var moddedImg = WritableImage(sourceImg.pixelReader, sourceImg.width.toInt(), sourceImg.height.toInt())

fun setImage() {
    val fn: List<File> =chooseFile("Choose a photo", ef, FileChooserMode.Single)
    sourceImg = Image(fn.first().toURI().toString())
    print(fn.first().toURI().toString())
}

fun makeBW() {
    val pixelReader = sourceImg.pixelReader
    val pixelWriter = moddedImg.pixelWriter

    // Determine the color of each pixel in a specified row
    for (i in 0 until sourceImg.width.toInt()) {
        for (j in 0 until sourceImg.height.toInt()) {
            val color = pixelReader.getColor(i, j)
            pixelWriter.setColor(i, j, color.grayscale())
        }
    }
}

fun update() {
    val pixelReader = sourceImg.pixelReader
    val pixelWriter = moddedImg.pixelWriter

    // Determine the color of each pixel in a specified row
    for (i in 0 until sourceImg.width.toInt()) {
        for (j in 0 until sourceImg.height.toInt()) {
            val color = pixelReader.getColor(i, j)
            pixelWriter.setColor(i, j, color)
        }
    }
}
}
1
András Kurucsai 5 April 2021, 01:07

1 menjawab

Jawaban Terbaik

ImageView memiliki properti untuk gambar yang dapat Anda ikat:

class PhotoView : View("Preview") {
    val main: MainController by inject()

    val root = hbox {
        imageview { imageProperty().bind(main.currentImageProperty) }
        ...
    }
    ...
}

class MainController : Controller() {
    val currentImageProperty = SimpleObjectProperty<Image>(...)
    var currentImage by currentImageProperty  // Optional
    ...
}

Dari sana, setiap kali Anda menyetel currentImage di MainController, itu akan diperbarui di PhotoView.

0
Ruckus T-Boom 5 April 2021, 16:16