【问题标题】:Can ZXing.NET read multiple QR barcodes in same image?ZXing.NET 可以读取同一张图片中的多个二维码吗?
【发布时间】:2014-11-25 14:29:25
【问题描述】:

我正在将 ZXing.NET 集成到 WPF 应用程序中,但我正在使用 BarcodeReader.Decode 方法来读取 QR 条码。它可以工作,但现在我想知道当图像有多个 QR 条码时会发生什么。我希望 ZXing 将它们全部读入一个数组。这可能吗?如果是,如何?我没有看到任何方法可以做到这一点。

编辑: 我发现有一个名为 QRCodeMultiReader 的类,我可以使用它来读取多个 QR 条码。但是您发送给 decodeMultiple 方法的参数是 ZXing.BinaryBitmap 类型的。如何将 Bitmap 转换为 BinaryBitmap?

这是我所拥有的,但是当我调用 decodeMultiple 时,结果变量始终为空:

public static List<BarCodeDataContract> MultipleDecode(Bitmap image)
{
    var converter = new ImageConverter();
    var bytes = (byte[])converter.ConvertTo(image, typeof(byte[]));
    LuminanceSource source = new RGBLuminanceSource(bytes, image.Width, image.Height);
    var binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

    var reader = new QRCodeMultiReader();
    var results = reader.decodeMultiple(binaryBitmap);
    var scannedQrBarcodes = new List<BarCodeDataContract>();

    foreach (var result in results)
    {
        if (result == null || result.BarcodeFormat != BarcodeFormat.QR_CODE || !result.Text.Contains(":")) return null;

        var qrCodeData = result.Text.Split(':');
        if (qrCodeData.Length != 2) return null;

        int numericCode;
        if (int.TryParse(qrCodeData[0], out numericCode))
        {
            if (System.Enum.IsDefined(typeof(QrCodeActionPrefixType), (short)numericCode))
            {
                Guid guid;
                if (Guid.TryParse(qrCodeData[1], out guid))
                {
                    scannedQrBarcodes.Add(new BarCodeDataContract()
                    {
                        QrCodeActionPrefixType = (QrCodeActionPrefixType)numericCode,
                        BarCodeObjectUniqueId = guid
                    });
                }
            }
        }
    }
    return scannedQrBarcodes;
}

【问题讨论】:

  • 你试过什么?很抱歉,我很抱歉,但是张贴带有多个 QR 码的图像所花费的时间比您发布该问题所花费的时间要少。
  • 我在问题中添加了我目前拥有的代码。但我不知道如何将我的图像转换为 BinaryBitmap。这是一个 WPF 应用程序。
  • 我更新了我的问题以包含将我的位图转换为 binarybitmap 的代码,但 decodeMultiple 方法总是返回 null。

标签: c# wpf zxing


【解决方案1】:

您可以使用处理 LuminanceSource 的 Binarizer 创建新的 BinaryBitmap。这些都是ZXing相关的类。

要获取 LuminanceSource,您可以创建一个新的 BitmapLuminanceSource,然后将其传递给您的 Bitmap。 (BitmapLuminanceSource 的基类是 BaseLuminanceSource 哪个基类是 LuminanceSource,这就是你想要的)

Binarizer 将您的 LuminanceSource 转换为 BinaryBitmap。这意味着生成的图像将只有黑白像素或点(二进制)。有多种方法可以对图像进行二值化,有些方法更适合其他条件,例如深色背景。您可以尝试不同的二值化器。

代码:

BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BitmapLuminanceSource(_insert your Bitmap here_)));

【讨论】:

    【解决方案2】:

    BarcodeReader 类实现了两个接口:IBarcodeReader 和 IMultipleBarcodeReader。 IMul​​tipleBarcodeReader 接口支持 DecodeMultiple 方法。 如果仅将 Property PossibleFormats 设置为 QR_CODE,则 BarcodeReader 在调用 DecodeMultiple 时在内部使用 QRCodeMultiReader 实现。如果您查找其他条形码类型,它会使用 GenericMultipleBarcodeReader。

    顺便说一句。如果使用结构化附加支持生成 QR_CODE,您将在 ResultMetadata 集合中找到找到的每个结果的序列号和奇偶校验信息。如果需要,这些信息有助于以正确的顺序构建最终结果。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2018-06-09
      • 2012-10-23
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多