条形码和二维码扫描不适用于 CameraX / ZXing
Barcode & Qr code scanning not working with CameraX / ZXing
我想在我的应用程序中实现二维码+条码扫描功能,但我只能扫描二维码。
我使用 ZXing 作为扫描库,使用 CameraX 作为相机功能。为了分析 CameraX 捕获的图像,我使用自定义 ImageAnalysis.Analyzer class 来检测和解码 QR 码 + 条形码(不起作用)。
这是我的分析仪:
class MyCodeImageAnalyzer(
private val onCodeDetected: (code: Result) -> Unit
) : ImageAnalysis.Analyzer {
private val yuvFormats = mutableListOf(YUV_420_888)
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
yuvFormats.addAll(listOf(YUV_422_888, YUV_444_888))
}
}
private val reader = MultiFormatReader()
override fun analyze(image: ImageProxy) {
// We are using YUV format because, ImageProxy internally uses ImageReader to get the image
// by default ImageReader uses YUV format unless changed.
if (image.format !in yuvFormats) {
Timber.e("QRCodeAnalyzer Expected YUV, now = ${image.format}")
return
}
val data = image.planes[0].buffer.toByteArray()
val source = PlanarYUVLuminanceSource(
data,
image.width,
image.height,
0,
0,
image.width,
image.height,
false
)
val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
try {
// Whenever reader fails to detect a QR code in image
// it throws NotFoundException
val result = reader.decode(binaryBitmap)
onCodeDetected(result)
} catch (e: NotFoundException) {
e.printStackTrace()
}
image.close()
}
}
我使用 MultiFormatReader,它考虑了多种格式,包括二维码和条形码。
我认为问题出在 yuvFormats 列表中,但我不知道要添加什么。
您可以使用 Google 机器学习套件扫描 QR/Barcodes。
请看我的文章here。在哪里可以看到如何使用 Google ML Kit 和 Jetpack CameraX 创建条码扫描仪。
这是最新的处理方式,而且太简单了。
我想在我的应用程序中实现二维码+条码扫描功能,但我只能扫描二维码。
我使用 ZXing 作为扫描库,使用 CameraX 作为相机功能。为了分析 CameraX 捕获的图像,我使用自定义 ImageAnalysis.Analyzer class 来检测和解码 QR 码 + 条形码(不起作用)。
这是我的分析仪:
class MyCodeImageAnalyzer(
private val onCodeDetected: (code: Result) -> Unit
) : ImageAnalysis.Analyzer {
private val yuvFormats = mutableListOf(YUV_420_888)
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
yuvFormats.addAll(listOf(YUV_422_888, YUV_444_888))
}
}
private val reader = MultiFormatReader()
override fun analyze(image: ImageProxy) {
// We are using YUV format because, ImageProxy internally uses ImageReader to get the image
// by default ImageReader uses YUV format unless changed.
if (image.format !in yuvFormats) {
Timber.e("QRCodeAnalyzer Expected YUV, now = ${image.format}")
return
}
val data = image.planes[0].buffer.toByteArray()
val source = PlanarYUVLuminanceSource(
data,
image.width,
image.height,
0,
0,
image.width,
image.height,
false
)
val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
try {
// Whenever reader fails to detect a QR code in image
// it throws NotFoundException
val result = reader.decode(binaryBitmap)
onCodeDetected(result)
} catch (e: NotFoundException) {
e.printStackTrace()
}
image.close()
}
}
我使用 MultiFormatReader,它考虑了多种格式,包括二维码和条形码。 我认为问题出在 yuvFormats 列表中,但我不知道要添加什么。
您可以使用 Google 机器学习套件扫描 QR/Barcodes。
请看我的文章here。在哪里可以看到如何使用 Google ML Kit 和 Jetpack CameraX 创建条码扫描仪。
这是最新的处理方式,而且太简单了。