C# 无法使用Zxing读取QR

C# 无法使用Zxing读取QR,c#,qr-code,zxing,decoder,C#,Qr Code,Zxing,Decoder,我正在使用zxing库生成和解码二维码。我在应用程序中动态生成二维码,并通过传真API发送包含二维码的文件。如果我从api收到此传真消息并对其进行解码,则Qr码读取成功,但当我通过传真发送此文件的扫描副本,然后接收并读取时,我无法执行此操作。但如果我尝试使用我的移动Qr应用程序读取此文件,它会正确读取Qr码。我无法找到如何读取此文件的解决方案 用于编码的方法: public static System.Drawing.Image GenerateJSONQrCode(QRJsonFax mode

我正在使用zxing库生成和解码二维码。我在应用程序中动态生成二维码,并通过传真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);
        }
    }
public static FaxReceiver.QrFinder DecodeQrCode(字符串imagePathToDecode)
{
长用户标识=0;
位图bitmapImage=(位图)Image.FromFile(imagePathToDecode);
ZXing.BarcodeReader BarcodeReader=new BarcodeReader(){AutoRotate=true,TryHarder=true};
结果解码=条形码阅读器.decode(位图图像);
var scanResult=string.Empty;
如果(解码!=null)
{
scanResult=解压缩(decode.Text);
}
如果(!string.IsNullOrWhiteSpace(scanResult))
{
//解密接收到的Qr
var decryptedString=DecryptionHelper.Decrypt(scanResult,FaxSetting.IsUseHashing);
//反序列化接收到的JSON
var resultJson=JsonConvert.DeserializeObject(decryptedString);
if(resultJson!=null)
{
long.TryParse(resultJson.UserID.ToString(),out UserID);
返回新的QrFinder()
{
FilePath=imagePathToDecode,
UserId=UserId,
PageNo=0,
DataSourceID=resultJson.DataSourceID,
InboundFaxTypeID=resultJson.InboundFaxTypeID
};
}
}
返回null;
}
私有静态字符串解压缩(字符串压缩文本)
{
字节[]gzBuffer=Convert.FromBase64String(compressedText);
使用(var ms=new MemoryStream())
{
int-msgLength=BitConverter.ToInt32(gzBuffer,0);
ms.Write(gzBuffer,4,gzBuffer.Length-4);
字节[]缓冲区=新字节[msgLength];
ms.Position=0;
使用(var zip=new GZipStream(ms,CompressionMode.decompresse))
{
读取(buffer,0,buffer.Length);
}
返回Encoding.UTF8.GetString(缓冲区);
}
}
包含二维码的文件

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

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

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

你自己去看看吧


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

谢谢您的回复,但我想知道您是如何计算缩小到50%后Qr将是可读的,因为我的原始图像的尺寸是1728*2148,50%是86*1074,但在这个尺寸下Qr也不可读,但您提供的图像尺寸512*636,对于这个Qr是可读的,所以基本上我想知道你用什么标准来找出我试验过的尺寸512*636I。我建议您尝试一些,看看什么最适合您的图像。谢谢,实际上我有不同的图像,对于一些只需将宽度调整到一半即可,对于你提供的一些尺寸,效果很好,但我正在寻找一个通用解决方案。你能建议如何制作一个通用解决方案,该解决方案可以读取所有Qr图像,这些图像至少可以被移动扫描仪读取。试着调整大小到几个不同的尺寸,并选择一个有效的尺寸。