Не удалось прочитать QR с помощью Zxing

Я использую библиотеку zxing для генерации и декодирования QR-кодов. В моем приложении я динамически генерирую QR-код и отправляю файл, содержащий QR, по факсу API. Если я получу это факсимильное сообщение от API и расшифрую его, код Qr будет прочитан успешно, но когда я отправлю отсканированную копию этого файла по факсу, а затем получу и прочитаю его, я не смогу этого сделать. Но если я попытаюсь прочитать этот файл с помощью своего мобильного приложения Qr, оно правильно прочитает код Qr. Я не могу найти решение, как прочитать этот файл.

Методы, используемые для кодирования:

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);
        }
    }

Файл, содержащий код Qr введите здесь описание изображения


person rupinder18    schedule 20.11.2015    source источник


Ответы (1)


Проблема в том, что QR-декодер сбивается с толку из-за промежутков между пикселями в отправленном по факсу изображении. Если мы приблизим его угол, вот что мы увидим.

введите здесь описание изображения

Сканер ищет сплошные черные квадраты для идентификации QR-кода.

Если мы уменьшим изображение на 50%, оно станет читаемым.

введите здесь описание изображения

Убедитесь сами на http://zxing.org/w/decode?u=http%3A%2F%2Fi.stack.imgur.com%2FSCYsd.png

Я бы посоветовал после получения отправленного по факсу изображения либо уменьшить его, либо применить фильтр, чтобы QR-коды были полностью черными. Вы также можете попробовать отправить его с меньшим разрешением, чтобы увидеть, поможет ли это.

person Terence Eden    schedule 20.11.2015
comment
спасибо за ответ, но могу ли я узнать, как вы рассчитали, что при уменьшении до 50% Qr будет читаемым, потому что размеры моего исходного изображения составляют 1728 * 2148, а его 50% - 86 * 1074, но при этих размерах также Qr не читается, но предоставленное вами изображение имеет размеры 512 * 636, и для этого Qr читается, поэтому в основном я хочу знать, какие критерии вы использовали для определения размеров 512 * 636. - person rupinder18; 23.11.2015
comment
Я экспериментировал. Я предлагаю вам попробовать несколько и посмотреть, что лучше всего подходит для ваших изображений. - person Terence Eden; 23.11.2015
comment
спасибо, на самом деле у меня есть разные изображения, и для некоторых просто изменение ширины до половины работает нормально, для некоторых размеров, предоставленных вами, работает нормально, но я ищу общее решение, можете ли вы предложить что-то, как сделать общее решение, которое будет читать все Qr изображения, которые по крайней мере читаются мобильными сканерами. - person rupinder18; 23.11.2015
comment
Попробуйте изменить размер до нескольких разных размеров и выберите тот, который работает. - person Terence Eden; 23.11.2015