0

PDFファイルを調べてProcessメソッドを呼び出して(PDFでqrコード画像を見つけるため)見つからない場合は、ファイルを回転させてProcessメソッドを再度実行するコードを書き込もうとしています。現在、回転後にファイルを実際にチェックしているとは思いませんが、同じ元のファイルを元の形式でチェックしています。回転した画像を Process メソッドに正しく渡すにはどうすればよいですか。

  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, 375, 375), fullImg.PixelFormat);
                        if (Process(bandImg) == null)
                        {
                             fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
                             bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat);
                            if (Process(bandImg) == null)
                            {
                                fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone);
                                bandImg = fullImg.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), fullImg.PixelFormat);
                                //Process(bandImg);
                                string QRinfo = Process(bandImg);
                                MessageBox.Show(QRinfo);
                                string[] qcode = QRinfo.Split('/');
                                string gid = qcode[qcode.Count() - 1];
                                Guid pgGuid = new Guid(gid);
                                var ar = dc.Assessments.FirstOrDefault(c => c.ID == pgGuid);
                                if (ar != null)
                                {
                                    var p = inputDocument.Pages[pg];
                                    string opdName = FILESTORELOCATION + pgGuid.ToString() + ".pdf";
                                    PdfDocument opd = new PdfDocument(opdName);
                                    opd.Pages.Add(p);
                                    opd.Close();

                                    ar.StoragePath = opdName;
                                    ar.LastUploadedDT = DateTime.UtcNow;
                                    ar.UploadedByUserID = uploadingUser;
                                    dc.SubmitChanges();
                                }
                            }
                        }
                    }    

プロセス方法:

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

1 に答える 1

1

再帰的な解決策が必要な場合は、これを確認してください(もちろんテストされていないコードです):

string ReadQrCode(Bitmap img, int n = 0) {
    if(n == 4) return null;

    var bandImg = img.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), 
        img.PixelFormat);
    string text = Process(bandImg);

    if(text == null) {
        img.RotateFlip(RotateFlipType.Rotate90FlipNone);
        text = ReadQrCode(img, n + 1);
    }

    return Text;
}

例:

string qrCode;
using (var fullImg = new Bitmap(workGif)) {        
    qrCode = ReadQrCode(bandImg);
}

説明:
この種の問題を実際に解決するために再帰は必要ありません。実際、以下のコメントで Alexei Levenkov が指摘したように、ループははるかに簡単で明確です。

string text = null;
for(int i = 0; i < 4; i++) {
    var bandImg = img.Clone(new System.Drawing.Rectangle(0, 0, 375, 375), 
            img.PixelFormat);
    text = Process(bandImg)

    if(text != null) break;
    else img.RotateFlip(RotateFlipType.Rotate90FlipNone);
}

再帰的なソリューションでは、n はカウンターがループ内で行うように動作します。これは、ループが (最大で) 4 回繰り返されるように、再帰が (最大で) 4 回の呼び出しの深さを持つことを意味します。

于 2013-03-19T18:56:17.607 に答える