如何使用 ZXing 库从图像中识别二维码?

How to recognize QR code from image using ZXing library?

我有 Xamarin Android 项目,我想从相机中识别 QR 码,同时将图片保存到存储中。我使用 Android.Hardware.Camera.IPreviewCallback 从相机获取图像。保存图像按预期工作,但二维码识别失败。这是我的代码:

void Android.Hardware.Camera.IPreviewCallback.OnPreviewFrame(byte[] data, Android.Hardware.Camera camera)
{
    byte[] jpegData = ConvertYuvToJpeg(data);
    Bitmap bitmap = BytesToBitmap(jpegData);
    SaveBitmapImage(bitmap); // This works great


    var width = (int)_textureView.Width;
    var height = (int)_textureView.Height;

    // How to get LuminanceSource??
    //LuminanceSource source = new RGBLuminanceSource(rgbValues, bm.Width, bm.Height, RGBLuminanceSource.BitmapFormat.ARGB32);
    //LuminanceSource source = new RGBLuminanceSource( jpegData, width, height);
    LuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 
        0, 0, width, height, false);
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

    QRCodeReader reader = new QRCodeReader();
    var result = reader.decode(binaryBitmap);
}

打电话给

var result = reader.decode(binaryBitmap);

总是 returns 空。

编辑:

看来是相机的问题。不关注二维码,图片模糊,ZXing库无法解码。如何让相机对焦?

相机对焦有问题。必须设置对焦模式。这是一个代码:

var parameters = _camera.GetParameters();
parameters.FocusMode = GetOptimalFocusMode(parameters);
_camera.SetParameters(parameters);

private String GetOptimalFocusMode(Android.Hardware.Camera.Parameters parameters)
{
    String result;
    IList<String> focusModes = parameters.SupportedFocusModes;

    if (focusModes.Contains(Android.Hardware.Camera.Parameters.FocusModeContinuousVideo))
    {
        result = Android.Hardware.Camera.Parameters.FocusModeContinuousVideo;
    }
    else if (focusModes.Contains(Android.Hardware.Camera.Parameters.FocusModeAuto))
    {
        result = Android.Hardware.Camera.Parameters.FocusModeAuto;
    }
    else
    {
        result = parameters.SupportedFocusModes.First();
    }

    return result;
}