Este es el segundo de tres artículos que estaré publicando con respecto a la generación de códigos QR con Java. En el artículo anterior expliqué cómo generar códigos QR utilizando la librería BarCode, la cual, debido a que es una versión de prueba, en ocasiones genera la leyenda 'Trial' junto con la imagen generada. En este caso explicaré cómo generar el código con la librería Zxing, la cual es opensource y de libre uso.
Comencemos entonces...
:: Obtener las librerías necesarias
En este segundo tutorial estaremos utilizando Zxing, concretamente utilizaremos la versión 1.6, tanto el core (o base) como las librerías específicas para aplicaciones de escritorio. La versión más reciente es la 1.7, sin embargo, encontré algunos bugs en dicha versión por lo que recomiendo la 1.6.
La liga de descarga para el proyecto Zxing es la siguiente:
http://code.google.com/p/zxing/downloads/detail?name=ZXing-1.6.zip&can=2&q=
Al descargar lo anterior tendrás un proyecto con muchas carpetas, no localizarás las librerías .jar directamente pero puedes generarlas a partir del código. Si no deseas hacerlo puedes ir a la parte final del tutorial y encontrarás los recursos necesarios para realizar el ejercicio de este tutorial ya compilados y listos para usar.
:: Crear el proyecto en NetBeans
Creamos un proyecto nuevo en NetBeans con el nombre de QRZxing, y una vez creado incluimos las librerías zxing-core1.6.jar y zxing1.6.jar dando clic derecho en Biblioteca > Agregar Archivo Jar / Carpeta y seleccionándolas dentro de nuestro sistema de archivos.
:: Definir el comportamiento
Así como en el tutorial anterior, lo primero que vamos a realizar es agregar algunas variables a nivel de clase con el fin de establecer los parámetros con los cuales esteremos creando las imágenes que contendrán los códigos QR. Para esto iremos a nuestra clase principal (generada por el IDE) y trabajaremos con ella.
Debido a que estaremos ejecutando todo el código dentro del método main es necesario que las variables sea estáticas.
private static final String FORMATO_IMAGEN = "gif";
private static final String RUTA_IMAGEN = System.getProperty("user.home") + "/qrZxing.gif";
private static final int ancho = 500;
private static final int alto = 500;
private static String datos = "http://monillo007.blogspot.com";
+ Los nombres de las variables son bastante explícitos así que no creo que requieran mayor información =).
Una vez que hemos creado y dado un valor a los parámetros agregaremos dentro del método main una nueva el objeto que contendrá la matriz de datos a dibujar así como el Writer que nos ayudará a darle formato a los datos:
BitMatrix bm;
Writer writer = new QRCodeWriter();
Posteriormente generaremos la matríz codificando los datos que establecimos previamente dándoles el formato que necesitamos, en este caso, el formato del código QR...
bm = writer.encode(datos, BarcodeFormat.QR_CODE, ancho, alto);
Una vez hecho lo anterior necesitaremos un buffer a través del cual escribir la imagen al disco duro...
BufferedImage image = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB);
Lo siguiente que realizaremos será escribir la matriz de datos con dos ciclos anidados, iterando a través de lo ancho y alto de la imagen...
for (int y = 0; y < ancho; y++) {
for (int x = 0; x < alto; x++) {
int grayValue = (bm.get(x, y) ? 1 : 0) & 0xff;
image.setRGB(x, y, (grayValue == 0 ? 0 : 0xFFFFFF));
}
}
Debido a un bug, las imágenes se crean con los colores invertidos (el negro por el blanco y viceversa) por lo cual es necesario invertir los colores de la imagen, para ello, agregaremos el siguiente método fuera del método main para que realice dicha tarea:
private static BufferedImage invertirColores(BufferedImage imagen) {
for (int x = 0; x < ancho; x++) {
for (int y = 0; y < alto; y++) {
int rgb = imagen.getRGB(x, y);
if (rgb == -16777216) {
imagen.setRGB(x, y, -1);
} else {
imagen.setRGB(x, y, -16777216);
}
}
}
return imagen;
}
Ya creado el método, regresamos a nuestro main y agregamos una llamada al mismo, con el fin de corregir la imagen...
image = invertirColores(image);
Posteriormente escribimos la imagen en el disco duro:
FileOutputStream qrCode = new FileOutputStream(RUTA_IMAGEN);
ImageIO.write(image, FORMATO_IMAGEN, qrCode);
Y cerramos el flujo de datos que utilizamos:
qrCode.close();
Por último utilizamos la clase Desktop para ver la imagen con el visor de imágenes predeterminado del sistema...
Desktop d = Desktop.getDesktop();
d.open(new File(RUTA_IMAGEN));
+ Más información sobre el uso de la clase Desktop aquí.
Para que el código anterior funcione debemos encerrarlo dentro de un try-catch.
Al ejecutar la aplicación tras realizar los pasos anteriores estaremos generando el código QR dentro de una imagen, para validarlo puedes utilizar alguno de los múltiples servicios web que existen actualmente y/o estar al pendiente de mi siguiente artículo sobre la interpretación / decodificación de códigos QR en Java.
Es importante mencionar que debido a que esta librería es opensource las imágenes de los códigos se generarán sin ningún tipo de leyenda o restricción, a diferencia de las que generamos en el artículo anterior.
Puedes descargar las librerías y código necesario para realizar lo explicado en este tutorial desde el siguiente vínculo.
La contraseña para descomprimir el archivo es: http://monillo007.blogspot.com
Si el artículo te fue de utilidad puedes compartirlo por medio de Twitter, Facebook o Google+ (botones superiores e inferiores del post), lo cual te agradecería.
Si tienes alguna duda o algo que decir te invito a que dejes tu comentario. Saludox.
Hola man no se si recibiste mi correo sobre un proyecto que ando haciendo, si no te platico como es: tengo que hacer una aplicacion para telefono (banca por internet) pero como sabes los que tienen internet son los touch asi que mi duda es con que tecnologias puedo hacer este proyecto pero en java, me platicaron de j2ME pero no se como apliqeu a un telefono touch, no se si me puedes recomendar algun libro o pagina.
ResponderBorrarEspero que me puedas ayudar
Sencillamente increible este blog!!
ResponderBorrarMuchisimas gracias! Eres un crack!!
Nos ayudas muchisimo!
Gracias muy buen post te felicito espero sigas subiendo información tan interesante, me gustaría que sacaras temas de personalizar codigosQR con imagenes o algo parecido pero gracias
ResponderBorrarQué tal,
ResponderBorrarLo agregaré a mis pendientes y veremos qué se puede hacer ok? Sigue visitando mi blog.
Saludox.
gracias, justo lo que necesitaba, mis alumnos en Guatemala, te lo agradecen.
ResponderBorrarHola amigo excelente post eres un grande mi pregunta es la siguiente este proyecto para pasar a android q libreria deberia utilizar ya q le intente con las mismas de aki pero genero errores en la parte de ImageIO.write(image, FORMATO_IMAGEN, qrCode); y en BufferedImage image = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB); si podrias ayudarme porfavor gracias
ResponderBorrarBuenas. Muy buen artículo, con un solo comentario:
ResponderBorrarSi cambias
int grayValue = (bm.get(x, y) ? 1 : 0) & 0xff;
por
int grayValue = (bm.get(x, y) ? 0 : 1) & 0xff;
los colores ya no salen invertidos, y no hay que hacer la llamada a invertirColeres.
Un saludo
Paco
:foreveralone:
ResponderBorrarBuenos días, quisiera ayuda por favor soy muy nuevo en esto:
ResponderBorrarhice la codificación como dice el tutorial, pero no me reconoce las librerías con los import.
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Writer;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
el error que me envía es que estos paquetes no existen.
Lo que hice fue importar el paquete ZXing-1.6.zip convertido en un ZXing-1.6.jar o como es que debería compilarlo o hacerlo, agradeceré su ayuda, gracias.
no se puede descargar de la pagina minus, al menos yo no he podido...alguien me pueda ayudar o compartirme los archivos ya compilados que no he podido compilarlos...gracias
ResponderBorrarYo baje el zxing-1.6, compile los dos .jar con el readme y me funciono, gracias por el tutorial
ResponderBorrarAmigo no puedo descargar la libreria en el link que esta publicado por favor si fueras tan amable de enviarmela a mi correo pamelitamarcillo@gmail.com
ResponderBorrarHola, no puedo descargarme la libreria segun el link que esta publicado.
ResponderBorrarpor favor puede enviar al correo guillermokike@hotmail.com