Leer (interpretar,decodificar) códigos QR en Java

Leer QR Java

Este es el último de 3 artículos dedicados a la generación e interpretación de códigos QR en Java. Anteriormente hemos visto cómo generar dichos códigos utilizando las librerías Barcode ( >> ir al artículo ) y Zxing ( >> ir al artículo ), en este caso explicaré paso a paso cómo decodificar y obtener el contenido de dichos códigos implementando igualmente la librería Zxing.

A darle entonces...

:: Obtener las librerías necesarias

En este tercer tutorial estaremos utilizando Zxing (al igual que en el segundo), concretamente utilizaremos la versión 1.6, tanto el core (o base) como las librerías específicas para aplicaciones de escritorio.

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 QRReader y una vez creado incluímos 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

Primero que todo vamos a definir las clases que vamos a utilizar (los llamados import's). Para esto iremos a nuestra clase principal (generada por el IDE) y agregamos el siguiente código justo debajo de la definición del paquete.

        import com.google.zxing.BinaryBitmap;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.Reader;
    import com.google.zxing.Result;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.HybridBinarizer;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;

   
Posteriormente, vamos a definir dentro del método main 3 objetos que nos servirán para la interpretación de los QR's:

    Reader lector = new MultiFormatReader();
   File ubicacionImagen = new File(System.getProperty("user.home") + "/qrcodeDemo.gif");    
   BufferedImage imagen;
   
    * lector: Objeto de tipo Reader que realizara la interpretacion del codigo QR
    * ubicacionImagen: El archivo que contiene la imagen con el codigo a interpretar.
    * imagen: Utilizado para leer la imagen.
   
Una vez hecho lo anterior vamos a verificar si el archivo que contiene la imagen existe...
   
    if(ubicacionImagen.exists()){
     .
     .
     }

y en caso de que sea así lo decodificamos para poderlo leer...

    imagen = ImageIO.read(ubicacionImagen);
   
Después formateamos la imagen para poderla interpretar...

    LuminanceSource fuente = new BufferedImageLuminanceSource(imagen);
   
Y creamos un mapa de bits a partir de ella...

    BinaryBitmap mapaBits = new BinaryBitmap(new HybridBinarizer(fuente));
   
Con esto va a ser posible leer su contenido, para ello le indicamos al lector que decodifique el mapa de bits que recién hemos creado:

    Result resultado = lector.decode(mapaBits);
   
El resultado lo almacena en un objeto de tipo com.google.zxing.Result al cual solo debemos invocar el método getText() para obtener el contenido del código QR:

    System.out.println("Contenido del codigo = "+resultado.getText());
   
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 decodificando el código QR dentro de la imagen indicada.

Con esto concluimos con la serie dedicada a los códigos QR, te invito a que leas los 2 artículos anteriores:

* Generar códigos QR en Java
* Generar códigos QR en Java con Zxing

Puedes descargar las librerías y código necesario para realizar lo explicado en este tutorial desde el siguiente vínculo.

http://min.us/l3x9YYN1SP1bK

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.

38 comentarios:

  1. Anónimo dijo...:

    Es posible leer un codigo tomado desde una camara en formato jpg?

  1. Monillo007 dijo...:

    Que tal,

    Claro que es posible, solo copia la imagen a tu equipo y reemplazas la ubicación en la variable ubicacionImagen para que puedas leerlo.

    Saludox.

  1. Anónimo dijo...:

    Lo he hecho de esta forma:
    File ubicacionImagen = new File(System.getProperty("user.home") + "/fotoQR.jpg");
    y me marca lo siguiente al ejecutar
    run:
    null
    com.google.zxing.NotFoundException

    Espero puedas ayudarme

  1. Monillo007 dijo...:

    Qué tal,

    Asegúrate primeramente que la imagen está en dicha ruta en caso de ser así igual verifica si realmente es un código válido, si quieres un código de prueba correcto puedes utilizar la imagen que encabeza este artículo.

    Saludox

  1. Anónimo dijo...:

    En formato gif no se tiene ningun problema =D lo lee de la siguiente forma: Contenido del codigo = http://monillo007.blogspot.com

    Solo que quisiera leer el formato jpg debo hacer algun cambio al programa para lograr esto? o solo lee gif?

  1. Monillo007 dijo...:

    Qué tal,

    No hay problema al leer el jpg, lo que puede ser es que el código que estás tratando de interpretar no sea válido o no sea soportado por zxing.

    Saludox

  1. Anónimo dijo...:

    Hola =D gracias, mi problema era el tamaño de la imagen jpg era demasiado grande, lo reduje y funciono muy bien

    Saludos, muy buen Blog.

  1. hola y gracias por el tutorial, una pregunta las librerias para decodificar el codigo qr se pueden usar en eclipse(usa Java)???

  1. Luis Navarro dijo...:

    Qué tal,

    Las librerías se pueden usar para cualquier IDE, incluyendo Eclipse.

    Saludox.

  1. Anónimo dijo...:

    genio!!!

  1. Anónimo dijo...:

    Hola, como podría hacer para que con este mismo código me interpretara códigos de barras?

    Gracias por vuestra respuesta.

  1. Luis Navarro dijo...:

    Pronto publicaré un artículo referente a ello, mantente al tanto.

    Saludos!

  1. Anónimo dijo...:

    Hola,como estas? estoy empezando con android y quiero hacer una aplicación que pueda leer un código qr. la idea era sacar una foto y mediante alguna api poder interpretar su contenido. Estoy usando el eclipse helios con el sdk de android. En todos lados recomiendan usar zxing pero según entendi es necesario descargar una aplicacion extra para poder leerlo. La pregunta concreta es si puedo usar esta biblioteca para mi aplicacion y poder leerlo nativamente sin tener el usuario que descargar algo más. Espero se entienda, capaz no esta muy bien explicado porque recien estoy arrancando. Disculpa la molestia, cualquier comentario es bienvenido para saber como empezar :)

  1. Don German dijo...:

    Hola! Antes que nada muchas gracias por el tutorial! Me sirvió muchisimo. La verdad que es muy útil.
    Ahora una pregunta que me viene matando desde hace rato y que no puedo solucionar: Existe alguna biblioteca (como ZXing) para usar la webcam como escaner de códigos QR en Java Standar? Estuve viendo un poco ZBar, pero al estar hecha en C/C++ es un poco complicado hacer el enganche. Lo que necesito es crear un aplicacion de escritorio en Java que, mediante la camara web, lea un codigo QR. Ya pase mucho tiempo buscando en Google y no encuentro nada parecido.
    Te agradeceria si pudieras ayudarme.

  1. Hola, muchas gracias por los tutoriales.

    Zxing o Barcode, ¿cuál te parece mejor?
    ¿Hay alguna otra librería mejor (aunque sea de pago)?

    Gracias.

  1. Luis Navarro dijo...:

    Qué tal Fernando,

    Si tu fin único es generar códigos (ya sea de barras, qr, etc) Zxing es todo lo que necesitas, fácil manejo, rápida y gratuita por lo que esa sería mi recomendación.

    Barcode es igualmente muy buena pero tiene el inconveniente de ser de paga, yo no pagaría por algo que puedo obtener completamente gratis de forma legal.

    Saludos.

  1. Hola Luis,

    con Zxing hemos encontrado el siguiente problema:
    http://code.google.com/p/zxing/issues/detail?id=1235

    Tenemos unos formularios con un código QR preimpreso. El usuario los rellena y luego los escaneamos. En función del código QR se mandan a un buzón electrónico u otro. El tema es que la librería de Zxing no está funcionando bien al leer (interpretar) algunos códigos QR que ella mismo a generado.

    Por eso estamos buscando una alternativa por si no se soluciona el problema.
    Según tu experiencia, ¿la alternativa sería Barcode?

    Recibe un cordial saludo,
    Fernando

  1. Luis Navarro dijo...:

    Fernando,

    He verificado y al parecer la librería Barcode para Java solamente funciona para crear códigos y no para leerlos, tienen un módulo para .NET y ActiveX que en teoría sí lo hacen.

    Mi recomendación sería que verificaras el proceso de creación de los códigos ya que es muy extraño que Zxing genere el QR pero no lo pueda leer, igual algo se les está escapando ya sea en la generación o lectura del mismo.

    Saludos.

  1. Hola Luis.
    Estoy intentando hacer el decodificar QR en J2ME(java para móviles) y tu tutorial me ha ayudado mucho.
    Pero tengo un problema,la clase BufferedImage no existe en J2ME y no se como pasar los datos de la imagen que tengo guardados en un array a un objeto LuminanceSource.
    ¿Puedes ayudarme?
    Muchas gracias!!

  1. Anónimo dijo...:

    Como se podria implementar la lectura de codigos QR con una webcam desde JAVA??? Excelente aporte.

  1. Anónimo dijo...:

    Muchas gracias

  1. Hola, abra posibilidad de que la libreria zxibg pueda leer codigos de barra tipo PDF417. Necesito hacer estos mismo pero con estos codigos gracias.

  1. Luis Navarro dijo...:

    Qué tal Diego,

    Te comento que sí te sirve esta misma librería para el formato que necesitas, los formatos soportados son:
    *UPC-A y UPC-E
    *EAN-8 y EAN-13
    *Code 39
    *Code 93
    *Code 128
    *ITF
    *Codabar
    *RSS-14 (todas las variantes)
    *QR Code
    *Data Matrix
    *Aztec ('beta' quality)
    *PDF 417 ('alpha' quality)

    Puedes encontrar más información al respecto en http://code.google.com/p/zxing/.

    Espero que te sirva, saludos. :D

  1. Angel Carrillo dijo...:

    funciona para leer con la webcam???

  1. Anónimo dijo...:

    Como me descargo el codigo listo para usarse, no hay manera.

  1. Luis Navarro dijo...:

    El link está al final del artículo.

    Saludos.

  1. edith dijo...:

    hola monillo que mas 2 preguntas ya tengo como leer la imagen cierto; pero entonces quiere decir que cuando el lector de codigos pase por una barrita entonces me crea una imagen de ese codigo de barras y me la guarda en el pc ? y si fuera asi en donde me guarda esa imagen? y si no fuera asi como hago para leer lo que mande el aparato lector de codigo de barras es que lo nesesito para leer un registro y guardarlo en una base de datos gracias =)

  1. Luis Navarro dijo...:

    Edith,

    Para leer estos códigos necesitas un dispositivo (como un celular con cámara) y un software compatible, no puedes hacerlo con un lector de barras tradicional.

    Te recomiendo leer la Wikipedia para más información al respecto: Códigos QR

    Saludos.

  1. DulceAdiccion dijo...:

    De este ennlace se pueden bajar los archivos .jar el javase y el core 1.6 y agregarlos a las librerias.
    http://www.java2s.com/Code/Jar/z/Downloadzxingjavasejar.htm
    salu2.

  1. DulceAdiccion dijo...:

    Hola otra ves yo, que se supone que hace la aplicacion? decodifica el codigo qr verdad? por que en mi netbeans compila y no hace nada, en la parte del codigo que dice "user.home" coloco mi nombre"jorge.home" y luego el nombre y el formato "/qrcodeDemo.jpeg" estoy haviendo algo mal?

  1. DulceAdiccion dijo...:

    hola ya funciono deje el codigo asi:
    new File(System.getProperty("user.home") + "/ejemplo.jpg"); en ves de .jpeg es .jpg sin la "e" y funciona. Tambien lo probe con .gif. Gracias.

  1. hola estoy haciendo una aplicacion que genere y lea codigos qr, pero quise hacer que la aplicacion leyera directamente desde la camara sin tener que guardarlo en un directorio, manteniendolo en el bufer, sin embargo no me funciona, no da error pero simplemente no lee el codigo qr, para hacerlo he implementado el codigo que has puesto y le he cabiado la parte de ubicacionimagen, en teoria deberia funcionar, mi pregunta es la siguiente, debo hacer algo diferente si leo la imagen desde la camara y la mantengo en bufer

  1. Hola.

    Me podrían pasar el código completo?

    Es que soy nuevo en Java y tengo un proyecto ensima.

    Gracias.

  1. Anónimo dijo...:

    Disculpa, ya no se puede descargar. ¿Lo podrías arreglar porfavor?
    Gracias :)

  1. Hola este proyecto es para java ME es decir para una aplicacion movil? y es decir cuando pase el codigo frente a mi camara lo leera el contenido ? o como funciona en si este programa me interes amucho gracias saludos

  1. Juan Francisco dijo...:

    como puedo descargar zxing1.6.jar el enlace que me das solo me manda a imagenes de un bloc??

  1. Disculpa una pregunta como puedo hacer un programa en JAVA utilizando un lector de Qr

  1. Los link estan rotos! podrias facilitarme las librerias por favor

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