2015-04-22 25 views
7

Używam w mojej aplikacji biblioteki ZXing do generowania kodu QR. Chcę wygenerować kod QR, który powinien pasować do szerokości ekranu (może trochę małych padów).Android: Wygenerowany kod QR za pomocą Zxing ma marginesy (nie pasuje do obszaru)

Jeśli ustawię szerokość ekranu jako szerokość rozmiaru kodu QR, otrzymam mniejszy kod QR. Spójrz na zrzut ekranu (to rozdzielczość 320x240). Chcę kod QR dopasować do czarnego obszaru. Dlaczego kod QR na czerwono jest tak mały?

Jak rozciągnąć go do czarnego obszaru?

From the app

Mój kod:

Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
display.getSize(size); 
int width = size.x; 

Bitmap bm = encodeAsBitmap(mGeneratedURL, BarcodeFormat.QR_CODE, width, width); 
qrcodeImage.setImageBitmap(bm); 

Generowanie QR code:

private Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException { 
    String contentsToEncode = contents; 
    if (contentsToEncode == null) { 
     return null; 
    } 
    Map<EncodeHintType, Object> hints = null; 
    String encoding = guessAppropriateEncoding(contentsToEncode); 
    if (encoding != null) { 
     hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); 
     //hints.put(EncodeHintType.CHARACTER_SET, encoding); 
     hints.put(EncodeHintType.MARGIN, 0); /* default = 4 */ 
    } 
    MultiFormatWriter writer = new MultiFormatWriter(); 
    BitMatrix result; 
    try { 
     result = writer.encode(contentsToEncode, format, img_width, img_height, hints); 
    } catch (IllegalArgumentException iae) { 
     // Unsupported format 
     return null; 
    } 

    int width = result.getWidth(); 
    int height = result.getHeight(); 
    int[] pixels = new int[width * height]; 
    for (int y = 0; y < height; y++) { 
     int offset = y * width; 
     for (int x = 0; x < width; x++) { 
      pixels[offset + x] = result.get(x, y) ? RED : Color.BLACK; 
     } 
    } 

    Bitmap bitmap = Bitmap.createBitmap(width, height, 
      Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
    return bitmap; 
} 

Odpowiedz

8

znajdę problem!

Linia:

String encoding = guessAppropriateEncoding(contentsToEncode); 

zwraca null

So It doesnt ustawić

EncodeHintType.MARGIN. 

Zdjąć codition i powinno być OK.

//if (encoding != null) { 
    hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); 
    //hints.put(EncodeHintType.CHARACTER_SET, encoding); 
    hints.put(EncodeHintType.MARGIN, 0); /* default = 4 */ 
//} 
+1

Należy pamiętać o przyczynie powstania tego marginesu. Obszar marginesu (nazywany strefą cichą) jest umieszczany na obrazie zgodnie z projektem, aby zapewnić najlepsze możliwe wyniki podczas skanowania. Zmniejszenie lub usunięcie strefy cichej może utrudnić niektórym skanerom szybkie i dokładne skanowanie kodu w nieoptymalnych warunkach, takich jak słabe oświetlenie, jednak w większości przypadków nie będzie to miało znaczenia. – BrentM