Saltar al contenido

¿Reducir el ancho del borde en los códigos QR generados por ZXing?

Presta atención porque en este tutorial hallarás el hallazgo que buscas.Esta reseña ha sido evaluado por nuestros expertos para garantizar la calidad y veracidad de nuestro post.

Solución:

La especificación QR requiere una zona silenciosa de cuatro módulos y eso es lo que crea zxing. (Ver QUIET_ZONE_SIZE en QRCodeWriter.renderResult.)

Las versiones más recientes de ZXing le permiten establecer el tamaño de la zona tranquila (básicamente, el relleno intrínseco del código QR) proporcionando un valor int con el EncodeHintType.MARGIN key. Simplemente inclúyelo en las sugerencias. Map usted suministra a la Writer‘s encode(...) método, por ejemplo:

Map hints = new EnumMap(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 2); /* default = 4 */

Si cambia esto, corre el riesgo de reducir la tasa de éxito de decodificación.

Incluso estableciendo EncodeHintType.MARGIN a 0el algoritmo que convierte la matriz de “puntos” de QRCode en datos de píxeles puede generar un pequeño margen (el algoritmo impone un número constante de píxeles por puntos, por lo que el tamaño de píxel del margen es el resto de la división entera del tamaño de píxeles por QR-Code tamaño de punto).

Sin embargo, puede omitir por completo esta generación de “punto a píxel”: calcula la matriz de puntos QRCode directamente llamando al público com.google.zxing.qrcode.encoder.Encoder clase, y genere la imagen de píxeles usted mismo. Código a continuación:

// Step 1 - generate the QRCode dot array
Map hints = new HashMap(1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCode qrCode = Encoder.encode(what, ErrorCorrectionLevel.L, hints);

// Step 2 - create a BufferedImage out of this array
int width = qrCode.getMatrix().getWidth();
int height = qrCode.getMatrix().getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray = new int[width * height];
int i = 0;
for (int y = 0; y < height; y++) 
  for (int x = 0; x < width; x++) 
    rgbArray[i] = qrCode.getMatrix().get(x, y) > 0 ? 0xFFFFFF : 0x000000;
    i++;
 
image.setRGB(0, 0, width, height, rgbArray, 0, width);

La conversión de la BufferedImage a los datos PNG se deja como ejercicio para el lector. También puede escalar la imagen configurando un número fijo de píxeles por punto.

Por lo general, está más optimizado de esa manera, el tamaño de la imagen generada es el más pequeño posible. Si confía en el cliente para escalar la imagen (sin desenfoque), no necesita más de 1 píxel por punto.

    HashMap hintMap = new HashMap();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
    hintMap.put(EncodeHintType.MARGIN, -1);

sin margen

ACTUALIZAR

Agregar dependencias (de comentarios)


    com.google.zxing 
    core 
    3.2.0
    jar 
 
 
    com.google.zxing
    javase 
    3.2.0 

Nos puedes corroborar nuestro trabajo mostrando un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *