Ir al contenido principal

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.

Comentarios

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

    ResponderEliminar
  2. 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.

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

    ResponderEliminar
  4. 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

    ResponderEliminar
  5. 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?

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

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

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

    ResponderEliminar
  9. Qué tal,

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

    Saludox.

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

    Gracias por vuestra respuesta.

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

    Saludos!

    ResponderEliminar
  12. 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 :)

    ResponderEliminar
  13. 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.

    ResponderEliminar
  14. 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.

    ResponderEliminar
  15. 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.

    ResponderEliminar
  16. 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

    ResponderEliminar
  17. 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.

    ResponderEliminar
  18. 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!!

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

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

    ResponderEliminar
  21. 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

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

    ResponderEliminar
  23. El link está al final del artículo.

    Saludos.

    ResponderEliminar
  24. 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 =)

    ResponderEliminar
  25. 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.

    ResponderEliminar
  26. 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.

    ResponderEliminar
  27. 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?

    ResponderEliminar
  28. 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.

    ResponderEliminar
  29. 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

    ResponderEliminar
  30. Hola.

    Me podrían pasar el código completo?

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

    Gracias.

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

    ResponderEliminar
  32. 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

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

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

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

    ResponderEliminar

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 domici…

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.

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.

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