如何在 kotlin 和 Jetpack Compose 中使用 zxing 读取带有颜色的二维码

问题描述 投票:0回答:1

我在kotlin中使用zxing来读取二维码,效果很好,但是我想读取带有颜色的二维码,但它不起作用,只有黑白,如何做到这一点?

这个读得很好,

此内容无法读取,

捕获活动肖像.kt

class CaptureActivityPortrait: CaptureActivity() {
}

构建.gradle

implementation("com.journeyapps:zxing-android-embedded:4.3.0")

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="co.edu.ut.jrbustosm.calina"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
    ....
    <application
        ....
        android:hardwareAccelerated="true"
        ....
        >
        <activity
            android:name=".MainActivity"
            ....
            android:screenOrientation="portrait"
            tools:replace="android:screenOrientation"
            ....
            >
        ....
        </activity>
        <activity
            android:name=".CaptureActivityPortrait"
            android:screenOrientation="sensorPortrait"
            android:stateNotNeeded="true"
            android:theme="@style/zxing_CaptureTheme"
            android:windowSoftInputMode="stateAlwaysHidden" />
    </application>
</manifest>

任何文件.kt

val scanLauncher = rememberLauncherForActivityResult(
    contract = ScanContract(),
) { result ->
    if (result.contents != null) {/*do something with result*/}
}

val scanOptions = ScanOptions()
scanOptions.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
scanOptions.setOrientationLocked(true)
scanOptions.setPrompt("Reading QR code")
scanOptions.setBeepEnabled(false)
scanOptions.setCaptureActivity(CaptureActivityPortrait().javaClass)

scanLauncher.launch(scanOptions)
android kotlin android-jetpack-compose qr-code zxing
1个回答
0
投票

这似乎是

zxing
中的设计,这是事实上的标准。

但是,您可以对图像进行一些预处理。支持的颜色越多,解决方案就越容易出错。 (即,如果有两种以上的颜色,出错的可能性就会增加)。

您可以使用 Kotlin 中的

ColorMatrixColorFilter
并应用
ColorMatrix
将位图转换为灰度,然后尝试再次读取它。

请参阅此处的示例: 使用 ColorMatrixFilter 和 ConvolutionFilter 操纵视觉效果

如果灰度不能解决问题,您将必须决定任意的灰色阴影(阈值),您希望将其转换为白色,将其之上转换为黑色 - 最终仅得到所需的两种颜色。

您可以通过以下方式使用 ImageMagick。 kmagick 有一个 oneliner 正是用于此目的:

convert <input> -threshold xx% <output>

查看其他调整答案:

© www.soinside.com 2019 - 2024. All rights reserved.