我正在将 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 集合中找到找到的每个结果的序列号和奇偶校验信息。如果需要,该信息有助于以正确的顺序建立最终结果。