2017-07-04 9 views
1

Ich versuche, einen QR-Code aus einer .png-Datei zu importieren und dekodieren Zxing.Mobile.net mit (https://www.nuget.org/packages/ZXing.Net.Mobile/ und https://www.nuget.org/packages/ZXing.Net.Mobile.Forms).Lese QR-Code in Xamarin Forms Mit ZXing

Wenn ich den QR-Code mit der Klasse ZXing.Mobile.MobileBarcodeScanner scanne, funktioniert die Decodierung wie erforderlich, beim Importieren aus einer Datei gibt die Qr-Code-Lesefunktion (ZXing.QrCode.QRCodeReader()) immer Null zurück.

Da ich Xamarin Formen verwende, behandelt jede Plattform die Bitmap/Image-Erstellung und der Portable-Teil den Rest (Zxing BinaryBitmap Erstellung und Dekodierung).

//Store rawBytes and image demensions 
PotableBitmap bMap = DependencyService.Get<IBitmap>().FileToBitmap(filePath); 

RGBLuminanceSource source = new RGBLuminanceSource(bMap.RgbBytes, bMap.Width, bMap.Height, RGBLuminanceSource.BitmapFormat.RGB32); 
HybridBinarizer binarized = new HybridBinarizer(source); 
BinaryBitmap bitmap = new BinaryBitmap(binarized); 
var reader = new ZXing.QrCode.QRCodeReader(); 
data = reader.decode(qrCodeBitmap); // This is always null 

Die DependencyService die plattformspezifische Funktion, im Moment so arbeite ich mit Andorid nennen, wird die Funktion wie folgt:

public PortableBitmap FileToBitmap(string ms) 
{ 
    var bytes = File.ReadAllBytes(ms); 
    Android.Graphics.Bitmap bMap = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length); 

    int[] intArray = new int[bMap.Width * bMap.Height]; 
    bMap.GetPixels(intArray, 0, bMap.Width, 0, 0, bMap.Width, bMap.Height) 

    List<byte> result = new List<byte>(); 
    foreach (int intRgb in intArray) 
    { 
     Color pixelColor = new Color(intRgb); 
     result.Add(pixelColor.R); 
     result.Add(pixelColor.G); 
     result.Add(pixelColor.B); 
    } 

    return new PortableBitmap(result.ToArray(), bMap.Width, bMap.Height); 
} 

ich einige der Beiträge SO ausgesehen haben auf die das gleiche Problem haben und haben folgendes versucht:

  • mit BitmapLuminanceSource: Noch gibt null zurück und erfordert die Verwendung einer anderen Bibliothek
  • Verwendung verschiedener Bitmap-Formate für die RGBLuminanceSource: RGB32, BGR32, ARGB32, ABGR32 (jedesmal, wenn die FileToBitmap Funktion zu ändern)
  • Versuchte die verschiedenen Digitalisierer, GlobalHistogramBinarizer()
  • geprüft, ob die Datei durch Lesen und wrinting es richtig gelesen wird zurück zu einer Datei.
  • ich versucht habe, die MultiFormatReader() mit dem reinen Barcode und versuchen Sie härter Hinweise
  • Ich habe gedebuggt auch die Code-Bibliotheken Quelle und von dem, was ich verstehe es einfach nicht den QR-Code in dem importierten Bild finden. Es wird keine Ausnahme ausgelöst.

Hier ist, wo die Rückkehr null gemacht wird:

private FinderPattern[] selectBestPatterns() 
    { 
     int startSize = possibleCenters.Count; 
     if (startSize < 3) 
     { 
      // Couldn't find enough finder patterns 
      return null; // It returns here 
     } 
     ... 

Der Online ZXing Decoder (https://zxing.org/w/decode.jspx) den QR-Code entschlüsseln kann ich richtig testen bin. Hier ist mein Test QR-Code:

enter image description here

+0

Eine Java-Lösung zu Ihrer Frage, kann es Ihnen helfen, den richtigen Weg, https://stackoverflow.com/questions/3422651/decoding-qr-code-from-image-stored-on-the-phone -mit-zxing-on-android-phone – Kevin

+0

Vielen Dank für den Link, aber ich habe diese Lösung bereits ohne Erfolg versucht – PMARSH

Antwort

0

erstellen Scanner Seite

Sie können die Barcode-Scannen in Ihrer Anwendung mit weniger als zwei Zeilen Code erhalten. Zunächst wird eine neue ZXingScannerPage erstellen und drücken Sie dann die Seite auf den Navigationsstapel:

var scanPage = new ZXingScannerPage(); 
// Navigate to our scanner page 
await Navigation.PushAsync (scanPage); 

Dadurch wird die Barcode-Scanner bringen und sie in Scanner-Modus setzt sofort.

Überprüfung der Ergebnisse Natürlich sollten Sie überprüfen, was gescannt wurde. Sie können dies tun, wenn die OnScanResult Ereignis Scannen zu stoppen wird ausgelöst, Pop der Scanner-Seite, und prüfen Sie das Ergebnis:

scanPage.OnScanResult += (result) => 
{ 
    // Stop scanning 
    scanPage.IsScanning = false; 

    // Pop the page and show the result 
    Device.BeginInvokeOnMainThread (async() => 
    { 
     await Navigation.PopAsync();   
     await DisplayAlert("Scanned Barcode", result.Text, "OK"); 
    }); 
}; 

Handhabung Berechtigungen Auf Android ZXing.Net erfordert die Kamera und Taschenlampe Erlaubnis funktionieren, so dass Sie diese Berechtigungen in den Projekteinstellungen überprüfen benötigen, oder fügen Sie sie auf Ihrem Android-Manifest:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.FLASHLIGHT" /> 

Weitere Informationen können Sie über diesen Link

https://blog.xamarin.com/barcode-scanning-made-easy-with-zxing-net-for-xamarin-forms/

+0

Ich kann scannen ein QR-Code. Ich habe die Scannerseite. Ich möchte in der Lage sein, einem Benutzer zu ermöglichen, einen QR-Code aus einer Bilddatei (.png) zu importieren. Die Bibliothek kann jedoch keinen QR-Code in dem Bild erkennen, das ich an die Decodierfunktion übergebe. – PMARSH