Generación de Códigos QR con Java

  1. Crear una matriz de código QR
  2. Aplicar colores a la matriz del código QR
  3. Generar el archivo del código QR

Implemantación en Java

A continuación se presenta una implementación utilizando la biblioteca ZXing de Google:

Clace Utilitaria para Códigos QR

package herramientas.codigoqr;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

/**
 * Utilidades para la creación y manipulación de códigos QR
 */
public class CreadorQR {

    private static final String CODIFICACION = "utf-8";
    private static final int COLOR_NEGRO = 0xFF000000;
    private static final int COLOR_BLANCO = 0xFFFFFFFF;

    /**
     * Genera una matriz de bits a partir de texto
     * @param contenido Texto a codificar en el QR
     * @param ancho Anchura deseada del código QR
     * @param alto Altura deseada del código QR
     * @return Matriz de bits representando el código QR
     */
    public static BitMatrix generarMatrizQR(String contenido, Integer ancho, Integer alto) {
        // Establecer dimensiones mínimas
        if(ancho == null || ancho < 300){
            ancho = 300;
        }
        if (alto == null || alto < 300){
            alto = 300;
        }
        
        // Configurar hints para la codificación
        Hashtable<encodehinttype> configuracion = new Hashtable<encodehinttype>();
        configuracion.put(EncodeHintType.CHARACTER_SET, CODIFICACION);
        
        // Generar la matriz
        BitMatrix matriz = null;
        try {
            matriz = new MultiFormatWriter().encode(contenido, BarcodeFormat.QR_CODE, ancho, alto, configuracion);
        } catch (WriterException e) {
            System.err.println("Error al generar la matriz QR: " + e.getMessage());
        }
        return matriz;
    }

    /**
     * Convierte una matriz de bits a una imagen BufferedImage
     * @param matriz Matriz de bits del código QR
     * @return Imagen representando el código QR
     */
    public static BufferedImage convertirABufferedImage(BitMatrix matriz){
        int ancho = matriz.getWidth();
        int alto = matriz.getHeight();
        BufferedImage imagen = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB);
        
        // Aplicar colores a cada píxel
        for (int x = 0; x < ancho; x++){
            for (int y = 0; y < alto; y++){
                imagen.setRGB(x, y, matriz.get(x, y) ? COLOR_NEGRO : COLOR_BLANCO);
            }
        }
        return imagen;
    }

    /**
     * Guarda una matriz de bits como archivo de imagen
     * @param matriz Matriz de bits del código QR
     * @param formato Formato de la imagen (jpg, png, etc.)
     * @param archivo Archivo de destino
     */
    public static void guardarArchivo(BitMatrix matriz, String formato, File archivo) {
        BufferedImage imagen = convertirABufferedImage(matriz);
        try {
            if (!ImageIO.write(imagen, formato, archivo)) {
                throw new IOException("No se pudo escribir una imagen con formato " + formato + " en " + archivo);
            }
        } catch (IOException e) {
            System.err.println("Error al guardar el archivo QR: " + e.getMessage());
        }
    }
}
</encodehinttype></encodehinttype>

Ejemplo de Uso

public static void main(String[] args) {
    // Texto a codificar
    String texto = "https://ejemplo.com/qr";
    
    // Archivo de destino
    File archivoDestino = new File("C://temp//codigoQR.png");
    
    // Generar y guardar el código QR
    guardarArchivo(generarMatrizQR(texto, 400, 400), "png", archivoDestino);     
}

Atlernativa con MatrixToImageWriter

/**
 * Genera un código QR usando MatrixToImageWriter
 */
public void crearCodigoQR() {
    String contenido = "https://ejemplo.com/" + generarIdentificadorUnico();
    int dimension = 450;
    
    // Configuración del código QR
    String nombreArchivo = "miQR";
    String rutaDestino = "D://codigosQR";
    HashMap<EncodeHintType, String> sugerencias = new HashMap<EncodeHintType, String>();
    
    // Especificar codificación
    sugerencias.put(EncodeHintType.CHARACTER_SET, "utf-8");
    
    try {
        BitMatrix matrizQR = new MultiFormatWriter().encode(
            contenido, 
            BarcodeFormat.QR_CODE, 
            dimension, 
            dimension, 
            sugerencias
        );
        
        // Crear archivo QR
        File archivoFinal = new File(rutaDestino, nombreArchivo + ".jpg");
        MatrixToImageWriter.writeToFile(matrizQR, "jpg", archivoFinal);
    } catch (Exception e) {
        System.err.println("Error en la creación del código QR: " + e.getMessage());
    }
}

/**
 * Genera un identificador único para el código QR
 * @return Cadena con identificador aleatorio
 */
private String generarIdentificadorUnico() {
    return Long.toString(System.currentTimeMillis(), Character.MAX_RADIX);
}

Etiquetas: java ZXing Códigos QR Generación de imágenes MatrixToImageWriter

Publicado el 6-1 13:13