likes
comments
collection
share

Flutter 中如何扫描黑底白块的二维码

作者站长头像
站长
· 阅读数 12

众所周知,大部分二维码(比如QR和DM)标准规定二维码应该以白色为背景色,黑色为前景色......好吧,其实我不知道,所以今天程序无法扫描黑底白块的二维码时,我觉得非常奇怪。

开发 Flutter 应用时,如果要扫描二维码,可以使用华为的huawei_scan库,它可以扫描各种格式的二维码,包括日常使用的QR码和工业常用的DM码。这个库可以应对很复杂的情况,比如模糊、远距离、反光等,但是对于黑底白块二维码,识别率很低。猜测,这个库考虑到这个问题了,但是对于这种情况的考虑处于低优先级,所以识别率低,识别速度慢。

为了提高识别速度,可以考虑把图片反相,即把二维码中黑色变白色,白色变黑色,再传给库进行识别。反相操作用image库可以完成。

示例代码如下:

import 'package:huawei_scan/huawei_scan.dart';
import 'package:image/image.dart'

String? scan(XFile picture){
  var data = decodeImage(await picture.readAsBytes());
  if (data != null) {
    data = invert(data); // 反相

    DecodeRequest request = DecodeRequest(data: Uint8List.fromList(image.encodeJpg(data)), scanType: HmsScanTypes.AllScanType);
    var res = await HmsScanUtils.decodeWithBitmap(request);
    
    return res.originalValue;
  }
}

如果遇到明显的卡顿问题(处理图片消耗很多资源),可以使用异步操作:

import 'package:huawei_scan/huawei_scan.dart';
import 'package:image/image.dart'

String? scan(XFile picture){
    var command = image.Command()..decodeImage(await file.readAsBytes());
    command.invert();
    command.encodeJpg();

    var data = await command.getBytesThread();
    if (data != null) {
      DecodeRequest request = DecodeRequest(
          data: data,
          scanType: HmsScanTypes.AllScanType);
      var res = await HmsScanUtils.decodeWithBitmap(request);

      return res.originalValue;
    } else {
      return null;
    }
}