Ir al contenido principal

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.

Comentarios

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

    ResponderBorrar
  2. Sencillamente increible este blog!!

    Muchisimas gracias! Eres un crack!!

    Nos ayudas muchisimo!

    ResponderBorrar
  3. 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

    ResponderBorrar
  4. Qué tal,

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

    Saludox.

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

    ResponderBorrar
  6. 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

    ResponderBorrar
  7. 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

    ResponderBorrar
  8. 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.

    ResponderBorrar
  9. 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

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

    ResponderBorrar
  11. 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

    ResponderBorrar
  12. Hola, no puedo descargarme la libreria segun el link que esta publicado.
    por favor puede enviar al correo guillermokike@hotmail.com

    ResponderBorrar

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.

Entradas más populares de este blog

3 sencillos pasos para tramitar la ayuda por desempleo de la AFORE

¿Tienes dinero ahorrado en tu AFORE y en este momento no estás trabajando o estás trabajando pero no tienes seguro social? Si respondiste sí a la pregunta anterior entonces hay una buena noticia para ti: puedes retirar una parte del dinero que tienes ahorrado. Y lo mejor, es muy sencillo. En este artículo te diré paso a paso qué hacer para obtener ese dinero, sin tecnicismos legales ni nada por el estilo, simple y sencillamente lo que necesitas saber. Paso Número 1: Obtener los últimos 2 estados de cuenta de tu Afore Esto en la mayoría de los casos es sumamente sencillo ya que dichos estados de cuenta llegan directamente al domicilio del ahorrador, si este es tu caso puedes saltar lo restante en este punto y continuar con el paso número 2, en caso contrario sigue leyendo… Si no tienes tus estados de cuenta debes ponerte en contacto con la empresa encargada de administrar tu ahorro para que te los proporcione, normalmente te van a pedir una identificación oficial, comprobante de

Conectar una base de datos en MySQL con NetBeans

NetBeans es una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans. Si eres un programador y desarrollas tus aplicaciones en Java seguramente necesitarás conectar una base de datos tipo MySQL a este entorno algún día, bueno, si lo necesitas ahora, he aquí una explicación paso a paso de cómo conectar ambas herramientas.

4 extraordinarias aplicaciones espía para Android

Le andas haciendo al James Bond y necesitas grabar video, voz o tomar fotos desde tu dispositivo Android sin ser notado? Aquí 4 excelentes aplicaciones que facilitarán tus hazañas de 007 en menos de lo que canta un gallo.

c606 c6nf5g4r6 e3 tec3ad6 [Como configurar el teclado]

¿Problemas al escribir con el teclado? ¿Tratas de escribir la letra ‘o’ y sale el número ‘6’ o algo por el estilo? La solución puede ser más simple de lo que parece. La solución a tu problema tras el salto...

Conexión, consulta y ejecución de sentencias en MySQL con Java

Anteriormente escribí este mismo artículo pero para bases de datos en Oracle . En este artículo prácticamente me copio y pego para explicar paso a paso cómo realizar la conexión a MySQL en Java, así como la forma de realizar consultas a los registros existentes y ejecutar sentencias de inserción, borrado y actualización de datos. Al final del artículo tendremos una clase que encapsulará todos los procedimientos necesarios para trabajar con la base de datos.