使用Zxing阅读Xamarin表格中的二维码

时间:2017-07-04 09:20:35

标签: c# xamarin.forms qr-code zxing

我正在尝试从 .png文件导入 QR码,并使用Zxing.Net.MobileZXing.Net.Mobile.Forms对其进行解码。

如果我使用ZXing.Mobile.MobileBarcodeScanner类扫描QR码,则解码按要求工作,但是,从文件导入时,Qr代码阅读器(ZXing.QrCode.QRCodeReader())解码函数始终返回{{ 1}}。

我正在使用 Xamarin Forms ;每个平台处理位图/图像创建,便携式部分处理其余部分(null创建和解码)。

Zxing BinaryBitmap

//Store rawBytes and image demensions PotableBitmap bMap = DependencyService.Get<IBitmap>().FileToBitmap(filePath); RGBLuminanceSource source = new RGBLuminanceSource(bMap.RgbBytes, bMap.Width, bMap.Height, RGBLuminanceSource.BitmapFormat.RGB32); HybridBinarizer binarized = new HybridBinarizer(source); BinaryBitmap bitmap = new BinaryBitmap(binarized); var reader = new ZXing.QrCode.QRCodeReader(); data = reader.decode(qrCodeBitmap); // This is always null 将调用平台特定功能,在我与Andorid合作的那一刻,功能如下:

DependencyService

我已经浏览了一些有关同样问题的帖子,并尝试了以下内容:

  • 使用public PortableBitmap FileToBitmap(string ms) { var bytes = File.ReadAllBytes(ms); Android.Graphics.Bitmap bMap = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length); int[] intArray = new int[bMap.Width * bMap.Height]; bMap.GetPixels(intArray, 0, bMap.Width, 0, 0, bMap.Width, bMap.Height) List<byte> result = new List<byte>(); foreach (int intRgb in intArray) { Color pixelColor = new Color(intRgb); result.Add(pixelColor.R); result.Add(pixelColor.G); result.Add(pixelColor.B); } return new PortableBitmap(result.ToArray(), bMap.Width, bMap.Height); } :仍然会返回BitmapLuminanceSource并需要使用其他库
  • null使用不同的位图格式:RGB32,BGR32,ARGB32,ABGR32(每次更改FileToBitmap函数)
  • 尝试了不同的RGBLuminanceSourceBinarizer
  • 通过读取文件并将其写回文件,检查文件是否正确读取。
  • 我尝试将GlobalHistogramBinarizer()与纯条形码一起使用并尝试更难提示
  • 我还调试了库源代码,根据我的理解,它无法在导入的图像中找到QR代码。没有例外。

这是返回MultiFormatReader()的地方:

null

在线Zxing decoder可以解码我正确测试的QR码。这是我的测试二维码:

My QR Code Image

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,在Android实现中使用这个方法从图像的路径返回一个RGBLuminanceSource

    public RGBLuminanceSource GetRGBLuminanceSource(string imagePath)
    {
        if (File.Exists(imagePath))
        {
            Bitmap bitmap = BitmapFactory.DecodeFile(imagePath);
            List<byte> rgbBytesList = new List<byte>();
            for (int y = 0; y < bitmap.Height; y++)
            {
                for (int x = 0; x < bitmap.Width; x++)
                {
                    var c = new Color(bitmap.GetPixel(x, y));
                    rgbBytesList.AddRange(new[] { c.A, c.R, c.G, c.B });
                }
            }
            byte[] rgbBytes = rgbBytesList.ToArray();
            return new RGBLuminanceSource(rgbBytes, bitmap.Height, bitmap.Width, RGBLuminanceSource.BitmapFormat.ARGB32);
        }
        return null;
    }