ZXing.NET可以在同一张图片中读取多个QR条形码吗?

时间:2014-11-25 14:29:25

标签: c# wpf zxing

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

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

这就是我所拥有的,但是当我调用decodeMultiple时结果变量总是为null:

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;
}

2 个答案:

答案 0 :(得分:1)

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

要获取LuminanceSource,您可以创建一个通过Bitmap的新BitmapLuminanceSource。 (BitmapLuminanceSource&#39;基类是BaseLuminanceSource,基类是LuminanceSource,这就是你想要的)

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

代码:

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

答案 1 :(得分:0)

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

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