我正在使用 JavaFX 创建桌面应用程序,该应用程序允许您从网络摄像头扫描二维码。
我决定选择JavaCV来处理网络摄像头翻转。但是,问题是CanvasFrame
类创建了一个Swing JFrame
。我的主要目标是找到将其与JavaFX组件集成的最佳方法。
我的问题是,是否可以在CanvasFrame
(或其他Swing / JavaFx组件)中创建JPanel
,而不是在JFrame
中创建。在此选项中,我将JPanel
包装到SwingNode
中-这解决了我的集成问题。
在我的案例中,我还寻求其他解决JavaFX与JavaCV集成问题的建议。 也许有直接的方法可以将相机屏幕嵌入JavaFx组件中。
我要在下面粘贴测试代码。我的代码是用kotlin编写的,但不会影响该问题:
import com.google.zxing.*
import com.google.zxing.client.j2se.BufferedImageLuminanceSource
import com.google.zxing.common.HybridBinarizer
import org.bytedeco.javacv.*
import java.awt.image.BufferedImage
import java.util.*
import java.util.concurrent.Executors
class Test {
companion object {
@JvmStatic
fun main(args: Array<String>) {
Executors.newSingleThreadExecutor().execute { testWebcam() }
}
private fun testWebcam() {
val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
val canvasFrame: CanvasFrame = CanvasFrame("Cam")
grabber.start()
while (canvasFrame.isVisible) {
val frame: Frame = grabber.grabFrame() ?: break
canvasFrame.showImage(frame)
decodeQrCode(grabber)
}
}
private fun decodeQrCode(grabber: OpenCVFrameGrabber) {
val java2DFrameConverter: Java2DFrameConverter = Java2DFrameConverter()
val frame: Frame = grabber.grabFrame()
val image = java2DFrameConverter.getBufferedImage(frame)
val decodedQr = parseQr(image)
println(decodedQr)
}
private fun parseQr(image: BufferedImage): String? {
val reader: MultiFormatReader = MultiFormatReader()
val binaryBitmap: BinaryBitmap =
BinaryBitmap(HybridBinarizer(BufferedImageLuminanceSource(image)))
val hints: Hashtable<DecodeHintType,Any> = Hashtable()
hints[DecodeHintType.CHARactER_SET] = "UTF-8"
hints[DecodeHintType.POSSIBLE_FORMATS] = listOf(BarcodeFormat.QR_CODE)
return try {
reader.decode(binaryBitmap,hints).text
} catch (e: NotFoundException) {
null;
}
}
}
}