2017-05-03 2 views
1

Ich habe eine Zeichenfolge in eine QR-Bitmap codiert. Das Bild wird wie folgt aus:Android QR Bitmap Hilfe zum Entfernen von Marge

image of QR bitmap

Was muss ich so ändern, dass es keine Leerzeichen um den QR ist? Ich habe versucht, in der Dokumentation zu MultiFormatWriter() und setPixels() nachzulesen, konnte aber nicht herausfinden, wo es falsch ist. Hier ist der Code:

Bitmap encodeAsBitmap(String str) throws WriterException { 
    BitMatrix result; 
    try { 
     result = new MultiFormatWriter().encode(str, 
       BarcodeFormat.QR_CODE, 500, 500, null); 
    } catch (IllegalArgumentException iae) { 
     return null; 
    } 

    int w = result.getWidth(); 
    int h = result.getHeight(); 
    int[] pixels = new int [w * h]; 
    for (int i = 0; i < h; i++) { 
     int offset = i * w; 
     for (int j = 0; j < w; j++) { 
      pixels[offset + j] = result.get(i, j) ? BLACK : WHITE; 
     } 
    } 

    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, 500, 0, 0, w, h); 
    return bitmap; 

} 

Antwort

0

Ich denke, das Problem ist die Art und Weise Sie Ihre Pixel in der Bitmap gesetzt.

Nach der documentation:

stride int: Die Anzahl der Farben in Pixel [] zwischen den Zeilen zu überspringen. Normalerweise entspricht dieser Wert der Breite der Bitmap, aber er kann größer (oder negativ) sein.

Deshalb schlage ich folgendes:

bitmap.setPixels(pixels, 0, w, 0, 0, w, h); 

Edit: gerade bemerkt, dass Sie davon ausgehen, dass die Größe der Eingabe ist 500. Sie können versuchen, es zu berechnen (die Zeichenfolge unter der Annahme, stellt ein Quadrat). Wenn es ein Rechteck ist, müssen Sie in der Lage sein, die Größe irgendwie zu berechnen, damit der MultiFormatWriter es lesen kann.

So kann Ihr Code sein:

Bitmap encodeAsBitmap(String str, int size) throws WriterException { 

    BitMatrix result; 
    try { 
     result = new MultiFormatWriter().encode(str, 
       BarcodeFormat.QR_CODE, size, size, null); 
    } catch (IllegalArgumentException iae) { 
     return null; 
    } 

    int[] pixels = new int [size * size]; 
    for (int i = 0; i < size; i++) { 
     int offset = i * size; 
     for (int j = 0; j < size; j++) { 
      pixels[offset + j] = result.get(i, j) ? BLACK : WHITE; 
     } 
    } 

    Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, size, 0, 0, size, size); 
    return bitmap; 

} 
+0

Es gibt noch ein Bild mit Rändern :( – Toeffen

+0

ich den Code aktualisiert –

+0

Das Update der Image Breite und Höhe des str.length gibt(), und es macht. Die ImageView ist nicht sichtbar. Aber das ist eine gute Richtung, um vorwärts zu gehen, wir brauchen wahrscheinlich die Länge (vielleicht?) des Ergebnisses. – Toeffen