2013-03-19 5 views
0

Я пытаюсь написать код, который будет искать в pdf-файл, и вызвать метод Process (чтобы найти qr-код в pdf-файле), если он не найден, тогда он вращает файл и запускает 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

В коде, который вы отправили, нет рекурсии ... –

+3

Вы передаете 'bandImg' в' Process() ', но вы никогда не обновляете' bandImg' после того, как вы повернули PDF; вы пробовали делать 'bandImg = fullImg.Clone (...' вызов после поворота и передачи * это * значение? – newfurniturey

+0

@AlexeiLevenkov, потому что мне нужна помощь в преобразовании операторов if в правильный рекурсивный вызов после поворота изображения – Masriyah

ответ

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

ОБЪЯСНЕНИЕ:
Рекурсия не требуется, чтобы решить такого рода проблемы на самом деле, действительно, как Алексей Левенков отметил в своем комментарии ниже, цикл гораздо проще и понятно:

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 ведет себя как счетчик в цикле, это означает, что рекурсия будет иметь глубину в четыре звонка (самое большее), точно так же, как цикл будет повторяться четыре раза (максимум).

+0

Спасибо, я постараюсь работать над этим и посмотреть, как он это сделает. Также я только что обновил свой пост с полным использованием кода, который я использую. – Masriyah

+0

Я предполагаю, что bandImg - это не полное изображение, а небольшая верхняя левая часть. Ваш код, кажется, вращает часть, а не полное изображение. – publicgk

+0

@newfurniturey: nice catch, thanks :) – BlackBear

Смежные вопросы