1

私はこれに頭を悩ませているので、これについて意見を求めていました。そのため、常にドキュメントの左上隅にある QR コードを含むスキャンした PDF ドキュメントを読み込んでいます。

ファイルをスキャンするとドキュメントの向きが変わる可能性があるため、ドキュメントの左上隅をチェックしてQRコードがあるかどうかを確認し、そうでない場合はドキュメントを回転させて左隅を再度確認します. これの目的は、QR コードが左上隅にあり、ドキュメントが私の要件に適した形式であるためです。

QRコードのドキュメントチェックを取得するように次のコードを変更するにはどうすればよいですか-見つからない場合は、ドキュメントチェック全体を再度ローテーションし、QRコードが見つかるまで続行します. また、90 - 180 - 270 ではなく、ループで 90 だけ回転する必要があります。

using (var fullImg = new Bitmap(workGif))
{
    var bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat);
    Bitmap result = fullImg;
    if (Process(bandImg) == null)
    {
        fullImg.RotateFlip(RotateFlipType.Rotate270FlipNone);
        bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, result.Width, result.Height), fullImg.PixelFormat);
        if (Process(bandImg) == null)
        {
            fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
            bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, result.Width, result.Height), fullImg.PixelFormat);

            if (Process(bandImg) == null)
            {
                fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone);
                bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, result.Width, result.Height), fullImg.PixelFormat);
            }
         }
    }
    bandImg.Save(@"C:\NewImageTest.png");
    string QRinfo = Process(bandImg);
    MessageBox.Show(QRinfo);
}

Process メソッド このメソッドに画像を渡し、読み取る QR コードがあるかどうかを確認します。

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 null;
    }
}
4

3 に答える 3

1

このようなものはあなたのために働きませんか?ドキュメントの向きは 4 つしかないため、最大 4 回ループする必要があります。ループごとに画像を 90 度回転します。QR コードが左上隅にあることを確認したらbreak、ループから抜け出すことができます。その後、QR コードを処理したり、必要な操作を行ったりできます。

public void Do(string workGif)
{
    // ...
    string qrInfo;
    using (var fullImg = new Bitmap(workGif))
    {
        for (int i = 0; i < 4; i++)
        {
            // Does the image contain a QR code?
            qrInfo = Process(fullImg);
            if (qrInfo = null)
                // No QR code found. Rotate the image.
                fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
            else
                // QR code found. Break out of the loop.
                break;
        }
        if (qrInfo == null)
        {
            throw new InvalidOperationException(
                "The document contains no QR code.");
        }
    }
    MessageBox.Show(qrInfo);
    // ...
}

ソース画像のコーナー画像を取得するコードをProcessメソッドに移動できます。

private Image GetCornerImage(Image sourceImage)
{
    return sourceImage.Clone(new Rectangle(0, 0, 375, 375), sourceImage.PixelFormat);
}

public string Process(Bitmap bitmap)
{
    var cornerImg = GetCornerImage(bitmap);

    var reader = new com.google.zxing.qrcode.QRCodeReader();
    LuminanceSource source = new RGBLuminanceSource(
        cornerImg, cornerImg.Width, cornerImg.Height);
    var binarizer = new HybridBinarizer(source);
    var binBitmap = new BinaryBitmap(binarizer);
    return reader.decode(binBitmap).Text;
}
于 2013-03-20T01:49:49.567 に答える
1

これでうまくいくはずです。

using (var fullImg = new Bitmap(workGif))
{
    var bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat);
    int i = 0;
    while(Process(bandImg) == null)
    {
        if (i == 1)
            fullImg.RotateFlip(RotateFlipType.Rotate270FlipNone);
        else if (i == 2)
            fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
        else if (i== 3)
            fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone);

            /*
                 Another way in which Rotation Degree can be done
                 First time it rotate by 270, then by 180 & then by 90
                 int i must be initialized with 1
                 int degree_to_rotate = 360 - ((4 - i) * 90)
            */

        bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, result.Width, result.Height), fullImg.PixelFormat);
        i++;
    }
    bandImg.Save(@"C:\NewImageTest.png");
    string QRinfo = Process(bandImg);
    MessageBox.Show(QRinfo);
}
于 2013-03-20T01:53:02.563 に答える
0

すべてのローテーションで同じチェックを行う場合、ループを使用しない理由はありません。実行されたローテーションの数を追跡していることを確認してください。そうしないと、無限ループに陥ります。

于 2013-03-20T01:49:24.270 に答える