Generar códigos QR en Java utilizando Zxing

Codigo QR con Java

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.

http://min.us/lie2WSGBEdpzj

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.

12 comentarios:

  1. carson314 dijo...:

    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.
    Espero que me puedas ayudar

  1. Carlos Scaloni dijo...:

    Sencillamente increible este blog!!

    Muchisimas gracias! Eres un crack!!

    Nos ayudas muchisimo!

  1. Anónimo dijo...:

    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

  1. Luis Navarro dijo...:

    Qué tal,

    Lo agregaré a mis pendientes y veremos qué se puede hacer ok? Sigue visitando mi blog.

    Saludox.

  1. carlos xavier dijo...:

    gracias, justo lo que necesitaba, mis alumnos en Guatemala, te lo agradecen.

  1. Khristain dijo...:

    Hola 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

  1. Anónimo dijo...:

    Buenas. Muy buen artículo, con un solo comentario:

    Si 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

  1. lincol dijo...:

    Buenos días, quisiera ayuda por favor soy muy nuevo en esto:
    hice 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.

  1. Anónimo dijo...:

    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

  1. juan dijo...:

    Yo baje el zxing-1.6, compile los dos .jar con el readme y me funciono, gracias por el tutorial

  1. Amigo 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

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes