- Crear una matriz de código QR
- Aplicar colores a la matriz del código QR
- 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);
}