无法在 Android Kotlin 中使用 Firebase Google ML Kit 扫描 Data Matrix 条形码图像位图

Unable to Scan Data Matrix barcode image bitmap using Firebase Google ML Kit in android Kotlin

提问人:Saad Malik 提问时间:7/13/2023 更新时间:7/13/2023 访问量:53

问:

我正在使用 Zxing 库生成 Data Matrix 条形码。生成后,我将生成的图像位图转换为字节数组后将生成的图像位图传递给下一个活动(否则我会得到错误)。在下一个活动中,我将它转换回位图并使用 Firebase Google ML Kit 扫描它。成功率只有100次中的5次。此外,如果我将生成的条形码保存在本地设备并使用 CameraX API 扫描它,我每次都可以扫描生成的条形码。这是因为我正在来回转换位图吗?或者我错过了其他东西。 这是官方文档的这个吗 ->

要识别 Data Matrix 代码,该代码必须与输入图像的中心点相交。因此,在图像中只能识别一个 Data Matrix 代码。

这是生成条形码的代码:

fun createBarcode(code: String, barcodeFormat: BarcodeFormat = BarcodeFormat.QR_CODE, width: Int? = 400, height: Int? = 400): Bitmap?  {
            val multiFormatWriter = MultiFormatWriter()
            val bitmap: Bitmap?
            return try {
                val bitMatrix = multiFormatWriter.encode(code, barcodeFormat, width!!, height!!)
                val barcodeEncoder = BarcodeEncoder()
                bitmap = barcodeEncoder.createBitmap(bitMatrix)
                bitmap
            } catch (e: Exception) {
                CustomException(e.message, cause = e.cause)
                null
            }
        }

要扫描生成的位图的代码:

 fun scanGalleryImage(context: Context, imageBitmap: Bitmap, onScanSuccess: (barcodeDetails: BarcodeDetail) -> Unit): BarcodeDetail? {
        var barcodeDetails: BarcodeDetail? = null
        val options = BarcodeScannerOptions.Builder()
            .setBarcodeFormats(
                AppConstants.qrFormatList[0],
                *AppConstants.qrFormatList.drop(1).toIntArray()
            )
            .build()
        val scanner = BarcodeScanning.getClient(options)

        try {
            val image = InputImage.fromBitmap(imageBitmap,0)
            scanner.process(image)
                .addOnSuccessListener { barcode ->
                    if(barcode != null && barcode.isNotEmpty()) {
                        barcodeDetails = ScannerUtility.getBarcodeDetails(barcode = barcode.first())
                        onScanSuccess.invoke(barcodeDetails!!)
                    } else {
                        ToastUtility.showError(context, context.resources.getString(R.string.error_invalid_qr_image), Toast.LENGTH_LONG)
                    }
                }
                .addOnFailureListener {
                    ToastUtility.showError(context, context.resources.getString(R.string.error_invalid_qr_image), Toast.LENGTH_LONG)
                }
            return barcodeDetails
        } catch (e: IOException) {
            CustomException(e.message,null, e.cause)
            return barcodeDetails
        }
    }

将位图转换为字节数组和字节数组转换为位图的代码:

val bitmap = ScannerService.createBarcode(productCode!!, BarcodeFormat.DATA_MATRIX, height = 100, width = 100)
            val byteArray = AppUtility.getByteArray(bitmap)
            activity.onCodeGenerated(byteArray)
val byteArray = intent.getByteArrayExtra(IMAGE_KEY_EXTRA)
        generatedImage = BitmapFactory.decodeByteArray(byteArray, 0, byteArray!!.size)

附言此代码适用于除 Data Matrix 之外的所有其他条形码

我还尝试在生成条形码时更改宽度和高度,但没有任何区别。

Android Kotlin ZXING Firebase-MLKit 矩阵

评论


答: 暂无答案