我在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)
这似乎是
zxing
中的设计,这是事实上的标准。
但是,您可以对图像进行一些预处理。支持的颜色越多,解决方案就越容易出错。 (即,如果有两种以上的颜色,出错的可能性就会增加)。
您可以使用 Kotlin 中的
ColorMatrixColorFilter
并应用 ColorMatrix
将位图转换为灰度,然后尝试再次读取它。
请参阅此处的示例: 使用 ColorMatrixFilter 和 ConvolutionFilter 操纵视觉效果
如果灰度不能解决问题,您将必须决定任意的灰色阴影(阈值),您希望将其转换为白色,将其之上转换为黑色 - 最终仅得到所需的两种颜色。
您可以通过以下方式使用 ImageMagick。 kmagick 有一个 oneliner 正是用于此目的:
convert <input> -threshold xx% <output>
查看其他调整答案: