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 0
el 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.