0

我有这种方法可以读取位图图像以解码文档中某个区域的 qr 码(查看 qr 码的四个角)由于我的代码方式,它总是会遇到错误消息,我知道它不能找到位图,但我想接受这个错误并以执行我剩余代码的方式进行翻译,即旋转文档并再次查找 qr 位图图像。

代码:

Bitmap[] corners = new Bitmap[] { bandImg1, bandImg2, bandImg3, bandImg4 };
                    string QRinfo = "";
                    for (int i = 0; i < corners.Length; ++i)
                    {
                        string tempQRinfo = Process(corners[i]);
                        if (tempQRinfo == null)
                        {
                            QRinfo = tempQRinfo;
                            switch (i)
                            {
                                case 0: break; //upper left
                                case 1: fullImg.RotateFlip(RotateFlipType.Rotate270FlipNone); break;
                                case 2: fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone); break;
                                case 3: fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone); break;
                            }
                            break;
                        }
                    }

找不到图像时导致错误的处理方法。

 public string Process(Bitmap bitmap)
    {
        var reader = new com.google.zxing.qrcode.QRCodeReader();

        try
        {
            LuminanceSource source = new RGBLuminanceSource(bitmap, bitmap.Width, bitmap.Height);
            var binarizer = new HybridBinarizer(source);
            var binBitmap = new BinaryBitmap(binarizer);
            return reader.decode(binBitmap).Text;
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

帮助:我想翻译错误消息,让文档在所有四个具有 qr 代码的角落进行搜索,然后如上所示旋转。

4

1 回答 1

0

Process方法中:

public string Process(Bitmap bitmap)
{
    var reader = new com.google.zxing.qrcode.QRCodeReader();

    try
    {
        LuminanceSource source = new RGBLuminanceSource(bitmap, bitmap.Width, bitmap.Height);
        var binarizer = new HybridBinarizer(source);
        var binBitmap = new BinaryBitmap(binarizer);
        return reader.decode(binBitmap).Text;
    }
    catch (Exception e)
    {
        //catch the exception and return null instead
        return null;
    }
}


然后在其他代码中:

Bitmap[] corners = new Bitmap[] { bandImg1, bandImg2, bandImg3, bandImg4 };
string QRinfo = null;
for (int i = 0; i < corners.Length; ++i)
{
    string tempQRinfo = Process(corners[i]);
    if (tempQRinfo != null) //if the string is NOT null, then we found the QR. If it is null, then the for loop will continue searching if it has more corners to look at
    {
        QRinfo = tempQRinfo;
        switch (i)
        {
            case 0: break; //upper left
            case 1: fullImg.RotateFlip(RotateFlipType.Rotate270FlipNone); break;
            case 2: fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone); break;
            case 3: fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone); break;
        }
        break;
    }
}

if(QRinfo == null)
{
    //we never found the QR!
    MessageBox.Show("Error! No QR found!");
}
else
{
    //here is the QR we found!
    MessageBox.Show(QRinfo);
}


所以这一切所做的就是将图像的角落放在一个数组中。应该保存 QR 信息的字符串设置为null. 数组被循环,每个角都被传递给该Process方法,以查看该角是否是带有 QR 码的角。在该Process方法中,QR 阅读器尝试读取图像。如果抛出错误,则将其捕获,并且该方法返回null. 如果没有错误,则该方法返回正确的字符串。一旦Process方法完成,我们检查返回的字符串以确保它不是null. 如果不是null,则找到了 QR,我们将 QR 字符串提供给 QRinfo,然后根据 QR 图像的哪个角落旋转 fullImg。如果字符串是null,然后它将继续循环遍历图像,直到找到带有 QR 的图像,或者没有剩余图像。

循环完成后,我们检查QRinfo. 如果它仍然是,null那么在任何角落都没有找到 QR。如果不是null,则找到一个 QR,并显示 QR 字符串。

因此,这可以满足您的要求。它吞下错误,并继续寻找 QR,以便您可以旋转和显示 QR。

注意:我改变了

string QRinfo = "";


string QRinfo = null;
于 2013-03-08T17:27:59.830 回答