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.
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.
Es posible leer un codigo tomado desde una camara en formato jpg?
ResponderBorrarQue tal,
ResponderBorrarClaro que es posible, solo copia la imagen a tu equipo y reemplazas la ubicación en la variable ubicacionImagen para que puedas leerlo.
Saludox.
Lo he hecho de esta forma:
ResponderBorrarFile 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
Qué tal,
ResponderBorrarAsegú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
En formato gif no se tiene ningun problema =D lo lee de la siguiente forma: Contenido del codigo = http://monillo007.blogspot.com
ResponderBorrarSolo que quisiera leer el formato jpg debo hacer algun cambio al programa para lograr esto? o solo lee gif?
Qué tal,
ResponderBorrarNo 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
Hola =D gracias, mi problema era el tamaño de la imagen jpg era demasiado grande, lo reduje y funciono muy bien
ResponderBorrarSaludos, muy buen Blog.
hola y gracias por el tutorial, una pregunta las librerias para decodificar el codigo qr se pueden usar en eclipse(usa Java)???
ResponderBorrarQué tal,
ResponderBorrarLas librerías se pueden usar para cualquier IDE, incluyendo Eclipse.
Saludox.
genio!!!
ResponderBorrarHola, como podría hacer para que con este mismo código me interpretara códigos de barras?
ResponderBorrarGracias por vuestra respuesta.
Pronto publicaré un artículo referente a ello, mantente al tanto.
ResponderBorrarSaludos!
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 :)
ResponderBorrarHola! Antes que nada muchas gracias por el tutorial! Me sirvió muchisimo. La verdad que es muy útil.
ResponderBorrarAhora 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.
Hola, muchas gracias por los tutoriales.
ResponderBorrarZxing o Barcode, ¿cuál te parece mejor?
¿Hay alguna otra librería mejor (aunque sea de pago)?
Gracias.
Qué tal Fernando,
ResponderBorrarSi 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.
Hola Luis,
ResponderBorrarcon 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
Fernando,
ResponderBorrarHe 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.
Hola Luis.
ResponderBorrarEstoy 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!!
Como se podria implementar la lectura de codigos QR con una webcam desde JAVA??? Excelente aporte.
ResponderBorrarMuchas gracias
ResponderBorrarHola, abra posibilidad de que la libreria zxibg pueda leer codigos de barra tipo PDF417. Necesito hacer estos mismo pero con estos codigos gracias.
ResponderBorrarQué tal Diego,
ResponderBorrarTe 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
funciona para leer con la webcam???
ResponderBorrarComo me descargo el codigo listo para usarse, no hay manera.
ResponderBorrarEl link está al final del artículo.
ResponderBorrarSaludos.
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 =)
ResponderBorrarEdith,
ResponderBorrarPara 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.
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
ResponderBorrarHola.
ResponderBorrarMe podrían pasar el código completo?
Es que soy nuevo en Java y tengo un proyecto ensima.
Gracias.
Disculpa, ya no se puede descargar. ¿Lo podrías arreglar porfavor?
ResponderBorrarGracias :)
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
ResponderBorrarcomo puedo descargar zxing1.6.jar el enlace que me das solo me manda a imagenes de un bloc??
ResponderBorrarDisculpa una pregunta como puedo hacer un programa en JAVA utilizando un lector de Qr
ResponderBorrarLos link estan rotos! podrias facilitarme las librerias por favor
ResponderBorrarEn caso que se utilice un lector de codigos de barras ¿como obtengo el valor del codigo?
ResponderBorrarAl leer el código, generalmente el lector da una salida de texto al lugar donde esté el foco del cursor. Si conectas tu lector, abres un editor tipo Bloc de notas y lees un código, el resultado aparecerá escrito en Bloc de notas como si lo hubieras escrito con el teclado.
BorrarEspero haber entendido tu pregunta :)
como podría mostrar la información del código de barras en un jlabel
ResponderBorrarLo ideal seria leer los codigos QR con una webcam o con la webcam de una laptop .... ??? como se aria eso
ResponderBorrarSin duda es muy buena opcion, muchas gracias por el codigo, como si fuera un Lector de Codigos tradicional.
ResponderBorrarque solución, si quiero pintar en un archivo de word el qr
ResponderBorrar