2016-07-18 9 views
-1

Ich habe eine Feature-Anfrage. Der aktuelle Fluss ist für den Benutzer, um einen Code zu scannen (kein QR-Code, nicht sicher, was es ist, zxing wird es scannen), dann scannen Sie die Testkarte.Scannen Sie einen Code mit Xzing von einem Foto

Der Client hat mich gebeten, dem Benutzer zu erlauben, den Test aus der Bibliothek zu importieren. Also müssen wir in der Lage sein, den Code eines Bildes zu scannen.

Ist es möglich, dies in Zxing zu tun oder bin ich gezwungen, die Kamera/Funktion zu verwenden ist nicht möglich?

Danke!

+1

Dieser Beitrag kann Sie in die richtige Richtung: http://stackoverflow.com/questions/32134072/qr-code-scan-from- image-file –

+0

Yeah collector hat mir das geschickt nachdem ich gepostet habe. Ich habe es auf einer Reihe von Fotos getestet, scheitert leider an allem. – StarWind0

+0

:/Das ist bedauerlich. Ich habe nicht versucht, den Code auszuführen, aber vielleicht ist er kaputt, aber eine Sache ist zu beachten, dass wenn die Qualität der Barcodebilder nicht gut genug für die Bibliothek ist, um sie lesen zu können, dann wird sie nicht scannen. Das ist einer der Hauptnachteile, wenn man versucht, ein statisches Bild für einen Barcode zu lesen, oder abhängig von der Bibliothek, um den Barcode in einem Strom von Live-Bildern von der Kamera auszuwählen. –

Antwort

0

Hier ist meine Lösung. Ich musste das Bild verkleinern und in den Farben, damit es mit Zxing funktioniert. Ich könnte einen Konvertiten hinzufügen in Graustufen, aber nicht heute ..

public static String scanDataMatrixImage(Bitmap bitmap) { 
    bitmap = doInvert(bitmap); 

    double scaling = getScaling(bitmap); 
    Bitmap resized; 
    if(scaling>0) { 
     resized = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * scaling), (int) (bitmap.getHeight() * scaling), true); 
    } 
    else{ 
     resized = bitmap; 
    } 

    String contents = null; 

    int[] intArray = new int[resized.getWidth() * resized.getHeight()]; 
    //copy pixel data from the Bitmap into the 'intArray' array 
    resized.getPixels(intArray, 0, resized.getWidth(), 0, 0, resized.getWidth(), resized.getHeight()); 

    LuminanceSource source = new RGBLuminanceSource(resized.getWidth(), resized.getHeight(), intArray); 
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); 


    MultiFormatReader reader = new MultiFormatReader(); 

    try 

    { 
     Result result = reader.decode(binaryBitmap); 
     contents = result.getText(); 
    } catch (
      Exception e 
      ) 

    { 
     Log.e("QrTest", "Error decoding barcode", e); 
    } 

    return contents; 
} 


private static double getScaling(Bitmap bitmap){ 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    int smallest = width; 
    if(smallest > height){ 
     smallest = height; 
    } 
    double ratio = 200.0/smallest; 
    return ratio; 
} 

public static Bitmap doInvert(Bitmap src) { 
    // create new bitmap with the same settings as source bitmap 
    Bitmap bmOut = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig()); 
    // color info 
    int A, R, G, B; 
    int pixelColor; 
    // image size 
    int height = src.getHeight(); 
    int width = src.getWidth(); 

    // scan through every pixel 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      // get one pixel 
      pixelColor = src.getPixel(x, y); 
      // saving alpha channel 
      A = Color.alpha(pixelColor); 
      // inverting byte for each R/G/B channel 
      R = 255 - Color.red(pixelColor); 
      G = 255 - Color.green(pixelColor); 
      B = 255 - Color.blue(pixelColor); 
      // set newly-inverted pixel to output image 
      bmOut.setPixel(x, y, Color.argb(A, R, G, B)); 
     } 
    } 

    // return final bitmap 
    return bmOut; 
} 
Verwandte Themen