ZXing.net解码抛出IndexOutOfRangeException

时间:2015-04-13 15:47:31

标签: windows-runtime windows-phone-8.1 ocr qr-code zxing

我正在构建一个Windows Phone应用程序(使用Windows Runtime,它是一个通用应用程序),需要能够扫描QR码。我正在使用ZXing.NET。我遇到的问题如下:当摄像头开始捕获时,ZXing抛出了一个IndexOutOfRangeException:

A first chance exception of type 'System.IndexOutOfRangeException' occurred in ZXing.winmd
   at ZXing.BitmapLuminanceSource..ctor(WriteableBitmap writeableBitmap)
   at ZXing.BarcodeReader.<.cctor>b__4(WriteableBitmap bitmap)
   at ZXing.BarcodeReader.Decode(WriteableBitmap barcodeBitmap)
   at xxx.Views.Scanner2.ScanBitmap(WriteableBitmap writeableBmp)
   at xxx.Views.Scanner2.<OnNavigatedTo>d__5.MoveNext()

我正在使用的代码是:

while (_result == null)
{
    using (var stream = new InMemoryRandomAccessStream())
    {
        await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);   

        stream.Seek(0);

        var writeableBitmap = new WriteableBitmap(1, 1);
        await writeableBitmap.SetSourceAsync(stream);

        _result = ScanBitmap(writeableBitmap);
    }
}

ScanBitmap功能如下:

private Result ScanBitmap(WriteableBitmap writeableBmp)
{
    var barcodeReader = new BarcodeReader
    {
        Options = new DecodingOptions
        {
            PossibleFormats = new[] { BarcodeFormat.QR_CODE },
            TryHarder = true
        },
        AutoRotate = true
    };
    var result = barcodeReader.Decode(writeableBmp);

    if (result != null)
    {
        CaptureImage.Source = writeableBmp;
    }

    return result;
}

完整的源代码可以在这里找到:http://pastebin.com/w90w0b3z

当我将图像捕获到文件系统然后读取它(而不是将图像捕获到内存流)时,我没有这个问题,但这非常慢并且使得用户界面在几秒钟内完全没有响应。它还需要不必要的权限才能访问相册。

有谁知道我怎么能让这个工作?我找到了这个帖子,但我不明白解决方案:http://zxingnet.codeplex.com/discussions/570173。我还发现了另一个使用诺基亚成像SDK的示例,但这对我来说也不起作用。

1 个答案:

答案 0 :(得分:4)

所以,由于http://www.soulier.ch/?p=2464&lang=en,我找到了一个有效的解决方案。事实证明,进入ImageEncodingProperties的{​​{1}}需要宽度和高度。我将宽度设置为400,高度设置为600.我也使用_mediaCapture.CapturePhotoToStreamAsync相同的宽度+高度。现在工作正常! (虽然仍然有点慢)