ZXing.NET 可以读取同一图像中的多个QR条形码



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

编辑:我发现有一个名为QRCodeMultiReader的类,我可以用来读取多个QR条形码。但是您发送到解码多个方法的参数是 ZXing.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;
}

您可以使用处理 LuminanceSource 的 Binarizer 创建新的二进制位图。这些都是与ZXing相关的类。

要获取亮度源,

您可以创建一个新的位图亮度源,通过位图传递该源。(BitmapLuminanceSource的基类是BaseLuminanceSource,哪个基类是LuminanceSource,这就是你想要的)

二旁白器将你的亮度源变成二进制位图。这意味着生成的图像将只有黑白像素或点(二进制)。有多种方法可以将图像二值化,有些方法更适合其他条件,例如深色背景。您可以尝试不同的二旁白器。

法典:

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

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

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

最新更新