【问题标题】:How to scan driver's license (PDF417) using xamarin forms + zxing on iOS 10.2如何在 iOS 10.2 上使用 xamarin forms + zxing 扫描驾驶执照 (PDF417)
【发布时间】:2017-03-09 01:38:22
【问题描述】:

我正在使用 Xamarin 表单编写 iOS 应用程序并使用 ZXing 库来扫描条形码。我正在尝试读取驾驶执照 (PDF417) 条形码,但图书馆无法识别该条形码。

如果我在PossibleFormats 中包含UPC 或其他条形码,它们会被正确扫描。

我还确定我要读取的条形码是 PDF417 条形码,因为 Scandit 能够在仅使用 PDF417 条形码时正确识别它。

这是我正在使用的代码。 我需要进行哪些更改才能正确识别 PDF417 条码?

async void Handle_Clicked (object sender, System.EventArgs e)
    {
        MobileBarcodeScanningOptions options = new MobileBarcodeScanningOptions ();
        options.PossibleFormats = new List<ZXing.BarcodeFormat> () {
            ZXing.BarcodeFormat.PDF_417
        };
        options.TryHarder = true;

        var scanPage = new ZXingScannerPage (options);


        scanPage.OnScanResult += (result) => {
            // Stop scanning
            scanPage.IsScanning = false;

            // Pop the page and show the result
            Device.BeginInvokeOnMainThread (async () => {
                await Navigation.PopAsync ();
                await DisplayAlert ("Scanned Barcode", result.Text, "OK");
            });
        };

        // Navigate to our scanner page
        await Navigation.PushAsync (scanPage);
    }

【问题讨论】:

  • 你使用的ZXing版本支持PDF417吗?
  • 另外,您是否通过任何其他扫描仪扫描条形码并获得结果?一些条形码可能很讨厌,例如最后包含垃圾行。值得注意的是,ZXing 对 PDF 417 的支持仍处于测试阶段,因此如果图像不够好,它甚至可能无法识别有效代码。
  • 条形码非常清晰,正如我之前所说,Scandit 可以正确识别。

标签: c# xamarin xamarin.ios barcode zxing


【解决方案1】:

几天前我遇到了同样的问题,并用以下方法修复了它。在MobileBarcodeScanningOptions 类中有一个CameraResolutionSelectorDelegate 类型的属性,称为CameraResolutionSelector。您可以将其设置为从可用分辨率列表中返回更高的相机分辨率。所以我对MobileBarcodeScanningOptions 的实例化如下所示:

var options = new MobileBarcodeScanningOptions {
            TryHarder = true,
            CameraResolutionSelector = HandleCameraResolutionSelectorDelegate,
            PossibleFormats = new List<BarcodeFormat> { BarcodeFormat.PDF_417 }
        };

还有我的HandleCameraResolutionSelectorDelegate

CameraResolution HandleCameraResolutionSelectorDelegate(List<CameraResolution> availableResolutions)
{
    //Don't know if this will ever be null or empty
    if (availableResolutions == null || availableResolutions.Count < 1)
        return new CameraResolution () { Width = 800, Height = 600 };

    //Debugging revealed that the last element in the list
    //expresses the highest resolution. This could probably be more thorough.
    return availableResolutions [availableResolutions.Count - 1];
}

这就是我需要更改以获得驾驶执照 (PDF417) 条码进行扫描的全部内容。

Here'sMobileBarcodeScanningOptions.cs的源代码来自ZXing github。

【讨论】:

  • 成功了。我现在可以扫描 PDF417 条码了。顺便说一句,您知道如何使用 xamarin 表单中的本机 iOS 扫描器 (AVCaptureSession) 吗?
  • @bonetoad 我是 Xamarin 形式的新手,我尝试实现上述代码但未能成功。如果您已经实现了相同的任何演示,请您帮助我。