2015-04-22 11 views
7

Sto utilizzando nella mia app la libreria ZXing per generare codice QR. Voglio generare un codice QR che dovrebbe adattarsi alla larghezza dello schermo (forse un piccolo padding).Android: il codice QR generato utilizzando Zxing ha margini (non è adatto all'area)

Se si imposta la larghezza dello schermo come larghezza del codice QR, ottengo codice QR più piccolo. Guarda lo screenshot (è una risoluzione di 320x240). Voglio che il codice QR si adatti all'area nera. Perché il codice QR è in rosso così piccolo?

Come si estende all'area nera?

From the app

Il mio codice:

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

Generazione QR:

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

risposta

8

trovo un problema!

Questa linea:

String encoding = guessAppropriateEncoding(contentsToEncode); 

restituisce null

So It Indifferente impostato

EncodeHintType.MARGIN. 

Rimuovere il codition e dovrebbe essere 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

Basta essere consapevoli del motivo per cui questo margine esiste. L'area del margine (nota come zona silenziosa) viene posizionata sull'immagine per design per fornire i migliori risultati possibili durante la scansione. Ridurre o rimuovere la zona silenziosa potrebbe rendere più difficile per alcuni scanner la scansione rapida e accurata del codice in condizioni non ottimali come la scarsa illuminazione, tuttavia nella maggior parte dei casi non farà alcuna differenza. – BrentM

Problemi correlati