【问题标题】:Unable to read QR using Zxing使用 Zxing 无法读取 QR
【发布时间】:2016-02-22 16:28:10
【问题描述】:

我正在使用 zxing 库来生成和解码二维码。在我的应用程序中,我正在动态生成 QR 码并通过传真 API 发送包含 QR 的文件。如果我从 api 获取此传真消息并对其进行解码,则成功读取二维码,但是当我通过传真发送此文件的扫描副本然后接收并读取它时,我无法做到这一点。但是,如果我尝试使用我的移动二维码应用程序读取此文件,它会正确读取二维码。我无法找到如何读取此文件的解决方案。

用于编码的方法:

public static System.Drawing.Image GenerateJSONQrCode(QRJsonFax model)
    {
        var jsonString = JsonConvert.SerializeObject(model);
        //encrypt json string
        jsonString = Hugo.BLL.Utilities.EncryptionHelper.EncryptQR(jsonString, FaxSetting.IsUseHashing);
        var bw = new ZXing.BarcodeWriter();
        var encOptions = new ZXing.Common.EncodingOptions() { Width = 200, Height = 200, Margin = 0 };
        bw.Options = encOptions;
        bw.Format = ZXing.BarcodeFormat.QR_CODE;
        var image = new Bitmap(bw.Write(Compress(jsonString)));
        return image;
    }

private static string Compress(string text)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        var ms = new MemoryStream();
        using (var zip = new GZipStream(ms, CompressionMode.Compress, true))
        {
            zip.Write(buffer, 0, buffer.Length);
        }

        ms.Position = 0;
        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);

        byte[] gzBuffer = new byte[compressed.Length + 4];
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
        return Convert.ToBase64String(gzBuffer);
    }

用于编码和解码的方法

 public static FaxReceiver.QrFinder DecodeQrCode(string imagePathToDecode)
    {
        long userId = 0;
            Bitmap bitmapImage = (Bitmap)Image.FromFile(imagePathToDecode);
            ZXing.BarcodeReader barcodeReader = new BarcodeReader() { AutoRotate = true, TryHarder = true }; ;
            Result decode = barcodeReader.Decode(bitmapImage);
            var scanResult = string.Empty;
            if (decode != null)
            {
              scanResult= Decompress(decode.Text);
            }

        if (!string.IsNullOrWhiteSpace(scanResult))
            {
                //decrypt Qr received
                var decryptedString = DecryptionHelper.Decrypt(scanResult, FaxSetting.IsUseHashing);

                //deserialize JSON received
                var resultJson = JsonConvert.DeserializeObject<QRJsonFax>(decryptedString);
                if (resultJson != null)
                {
                    long.TryParse(resultJson.UserID.ToString(), out userId);
                    return new QrFinder()
                    {
                        FilePath = imagePathToDecode,
                        UserId = userId,
                        PageNo = 0,
                        DataSourceID = resultJson.DataSourceID,
                        InboundFaxTypeID = resultJson.InboundFaxTypeID
                    };
                }
            }
        return null;
    }

   private static string Decompress(string compressedText)
    {
        byte[] gzBuffer = Convert.FromBase64String(compressedText);
        using (var ms = new MemoryStream())
        {
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

            byte[] buffer = new byte[msgLength];

            ms.Position = 0;
            using (var zip = new GZipStream(ms, CompressionMode.Decompress))
            {
                zip.Read(buffer, 0, buffer.Length);
            }

            return Encoding.UTF8.GetString(buffer);
        }
    }

包含二维码的文件

【问题讨论】:

    标签: c# qr-code zxing decoder


    【解决方案1】:

    问题在于 QR 解码器被传真图像中像素之间的间隙弄糊涂了。如果我们放大它的一个角落,这就是我们所看到的。

    扫描仪正在寻找实心黑色方块来识别二维码。

    如果我们将图像缩小 50%,它就会变得可读。

    http://zxing.org/w/decode?u=http%3A%2F%2Fi.stack.imgur.com%2FSCYsd.png亲自查看

    我建议您在收到传真后的图像后,要么将其缩小,要么应用过滤器以确保二维码为纯黑色。您还可以考虑以较小的分辨率发送它,看看是否有帮助。

    【讨论】:

    • 感谢您的回复,但我想知道您是如何计算出缩小到 50% Qr 将是可读的,因为我的原始图像的尺寸是 1728 * 2148,其 50% 是 86* 1074 但在这个尺寸也 Qr 不可读,但你提供的图像有尺寸 512 * 636 并且这个 Qr 是可读的,所以基本上我想知道你用什么标准来找出尺寸 512*636
    • 我做了实验。我建议您尝试一些,看看哪种方法最适合您的图像。
    • 谢谢,实际上我有不同的图像,对于一些只是将宽度调整为一半可以正常工作,对于您提供的某些尺寸可以正常工作,但我正在寻找一个通用的解决方案,你能建议一些应该怎么做一个通用的解决方案,可以读取所有移动扫描仪至少可以读取的 Qr 图像。
    • 尝试调整到几种不同的尺寸,然后选择一个可行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多