studio personalizados libreria leer lector gratis google generador crear codigos codigo code barras zxing

personalizados - libreria zxing android studio



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

En veloz puedes:

let hints = ZXEncodeHints() hints!.margin = NSNumber(int: 0) let result = try writer.encode(code, format: format, width: Int32(size.width), height: Int32(size.height), hints: hints) let cgImage = ZXImage(matrix: result, onColor: UIColor.blackColor().CGColor, offColor: UIColor.clearColor().CGColor).cgimage let QRImage = UIImage(CGImage: cgImage)

Estoy usando com.google.zxing.qrcode.QRCodeWriter para codificar datos y com.google.zxing.client.j2se.MatrixToImageWriter para generar la imagen del código QR. En una imagen de 400x400, hay alrededor de un borde ancho de 52 píxeles alrededor del código. Me gustaría que este borde fuera más estrecho, tal vez 15 píxeles, pero no veo nada en la API para hacer eso. ¿Me estoy perdiendo algo en la documenación? ¿O necesitaría procesar la imagen yo mismo?

Para referencia, aquí hay un ejemplo de código QR 400x400 producido con la biblioteca ZXing:


Incluso al establecer EncodeHintType.MARGIN en 0 , el algoritmo que convierte la matriz de "puntos" de QRCode puede generar un pequeño margen (el algoritmo aplica un número constante de píxeles por puntos, por lo que el tamaño del píxel del margen es el resto del entero) división del tamaño de los píxeles por el tamaño del punto del código QR).

Sin embargo, puede omitir completamente esta generación de "punto a píxel": calcula la matriz de puntos QRCode directamente llamando a la clase pública com.google.zxing.qrcode.encoder.Encoder , y genera la imagen de píxel usted mismo. Código abajo:

// Step 1 - generate the QRCode dot array Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(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 BufferedImage a PNG data se deja como un ejercicio para el lector. También puede escalar la imagen estableciendo un número fijo de píxeles por puntos.

Por lo general, es más optimizado de esa manera, el tamaño de imagen generado 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.


La especificación QR requiere una zona silenciosa de cuatro módulos y eso es lo que crea zxing . (Consulte 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) al proporcionar un valor int con la clave EncodeHintType.MARGIN . Simplemente inclúyalo en el Map sugerencias que proporciona al método de encode(...) del Writer , por ejemplo:

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

Si cambia esto, se arriesga a reducir la tasa de éxito de la decodificación.


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

sin margen

ACTUALIZAR

Añadir dependencias (a partir de comentarios)

<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> <type>jar</type> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.0</version> </dependency>