Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Generador de códigos QR (Quick Response)

Generador de códigos QR (Quick Response)

Autor jc mouse jueves, febrero 12, 2015

En este tutorial aprenderemos a crear nuestra propia aplicación java para generar códigos QR.

¿Que es un Código QR?

«Un código QR (quick response code, «código de respuesta rápida») es un módulo útil para almacenar información en una matriz de puntos o un código de barras bidimensional creado en 1994 por la compañía japonesa Denso Wave, subsidiaria de Toyota.» [Santa Wikipedia]

QR example

Necesitamos

Tiempo: 15 minutos
Nivel: Intermedio

Tutorial

Esta aplicación permitirá codificar un texto introducido por teclado por el usuario, especificar las dimensiones del mismo, generar el código QR y tener la posibilidad de guardarlo en disco en formato de imagen.

Paso 1. Descarga e instala las librerías ZXing, si ya las tienes instaladas salta al paso 2

Paso 2. Crea un nuevo proyecto en Netbeans llamado «QRCreator» que tenga la siguiente estructura:

proyecto

  • Interfaz.java: es un JFrame, la interfaz principal de nuestra aplicación
  • MyQRCreator.java: Clase donde se implementara los métodos de la libreria ZXing
  • QRDialog.java: es una clase de tipo JDialog

Ademas debemos añadir las librerías de ZXing al proyecto

Paso 3: La interfaz

Ayudándote de las herramientas gráficas de Netbeans crea una interfaz como la siguiente imagen:

gui qr

No te olvides de cambiar los nombres de los objetos que están numerados.

Adicionalmente al JSpinner debes modificar su Model de la siguiente forma:

  • Model Type: Number
  • Number Type: Integer
  • Initial Value: 150
  • Minimum : 100
  • Maximum: 500
  • Step Size: 10

Paso 4. JDialog (QRDialog)

La interfaz del JDialog, solamente consiste solamente en un JLabel, ayúdate de un GridBagLayout para centrarlo en la ventana. Este JDialog nos permitirá mostrar el QR.

dialog

Paso 5. MyQRCreator.java

Esta clase contiene un método para crear codificar un texto y retornar una imagen en memoria.

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO; 
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Writer;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.EnumMap;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class MyQRCreator {

    /** Constructor de clase */
    public MyQRCreator(){}

    /**
 * Metodo que crea el QR
 * @param String data Texto a codificar
 * @param int size dimension (Alto,ancho) de la imagen a generar
 * @return BufferedImage
 */
    public BufferedImage createQR(String data, int size)
    {
        BitMatrix matrix;
        Writer writer = new MultiFormatWriter();
        try {            
            EnumMap<EncodeHintType,String> hints = new EnumMap<EncodeHintType,String>(EncodeHintType.class);
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");            
            matrix = writer.encode(data, BarcodeFormat.QR_CODE, size, size, hints);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(matrix, "PNG", output);
            byte[] data_array = output.toByteArray();
            ByteArrayInputStream input = new ByteArrayInputStream(data_array);
            return ImageIO.read(input);            
        } catch (com.google.zxing.WriterException ex) {
            System.err.println(ex.getMessage());
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
        return null;
    }

}//end:MyQRCreator

Paso 5: Interfaz (Código)

Abrimos nuevamente nuestra clase Interfaz y en el evento del botón «btnCreate» añadimos el siguiente código

    private void BtnCreateActionPerformed(java.awt.event.ActionEvent evt) {                                          

        if(TxtContent.getText().length()>0)
        {
            MyQRCreator qr = new MyQRCreator();
            QRDialog qRDialog = new QRDialog(this,true);            
            qRDialog.setImageQR( qr.createQR(TxtContent.getText(), (Integer)SpDimension.getValue()) );
            qRDialog.setVisible(true);    
        }  

    }

Paso 6: QRDialog

Para terminar la aplicación, abrimos la clase QRDialog en modo código.

Modificamos el constructor de clase de la siguiente manera:

    BufferedImage bufferedImage;
    /**
 * Creates new form QRDialog
 */
    public QRDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();

        setTitle("QR");
        jLabel1.setText("");
        jLabel1.setToolTipText("Click to save");
        setLocationRelativeTo(null);        
        setBackground(Color.white);
    }

Declaramos un nuevo método «setImageQR» que nos permitirá pasar una imagen al JDialog

    public void setImageQR(BufferedImage bufferedImage)
    {
        if(bufferedImage!=null)
        {
            this.bufferedImage = bufferedImage;
            ImageIcon icon = new ImageIcon(bufferedImage);            
            setSize(icon.getIconWidth()+20,icon.getIconHeight()+40);
            jLabel1.setIcon( icon );                        
        }
    }

Para terminar agregamos el siguiente código al evento del único JLabel del QRDialog

    private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("Save QR");
        FileFilter filter = new FileNameExtensionFilter("QR Image", "PNG");
        fileChooser.addChoosableFileFilter(filter);
        int userSelection = fileChooser.showSaveDialog(this);
        if (userSelection == JFileChooser.APPROVE_OPTION)
        {
            File fileToSave = fileChooser.getSelectedFile();
            if (!fileToSave.toString().endsWith(".png"))
            {
             fileToSave = new File(fileChooser.getSelectedFile()+".png");
            }
            try {            
                ImageIO.write(bufferedImage, "png", fileToSave);
            } catch (IOException ex) {
                System.err.println( ex.getMessage() );
            }
            dispose();
        }
    }

Este código nos permite abrir una ventana «Save as» para guardar en disco el QR generado en formato PNG

app qr creator

Descargar proyecto QRCreator

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Tutoriales para creación de videojuegos gratis en descarga directa

Tutoriales para creación de videojuegos gratis en descarga directa

La comunidad 3D Buzz  era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos...

Rompecabezas con forma irregular

Rompecabezas con forma irregular

En este post vemos una manera de como crear un juego de rompecabezas en java sin el uso de java2d, ademas, las piezas de...

Procedimientos Almacenados: Parámetros INOUT

Procedimientos Almacenados: Parámetros INOUT

En post anteriores vimos lo que son los parámetros IN y los parámetros OUT pero existe otro tipo de parámetro que es la...

Uso del condicional IF

Uso del condicional IF

En este post conocernos lo que son las Estructuras de Control IF en los script de Bash. Estas estructuras nos ayudan a c...

Migrar proyecto Netbeans a Eclipse

Migrar proyecto Netbeans a Eclipse

En ocasiones por motivos cualesquiera que sea queremos pasar proyectos hechos en netbeans a Eclipse, Netbeans cuenta con...

Como saber el tipo de objeto que contiene un hashmap

Como saber el tipo de objeto que contiene un hashmap

La clase hashMap es muy util para almacenar objetos de la forma ( Clave, Objeto ), donde Clave es un identificador único...

13 comentarios en “Generador de códigos QR (Quick Response)”

  1. luis dice:

    Muy bien aporte

  2. Cristina Salas Maita dice:

    Muy bien. Una consulta: yo utilice el barcode y en mi computadora funciona correctamente. Pero cuando copio el .jar de mi aplicacion en otra PC no funciona., cuando quiere crear la instancia del QR, da error y no la crea. No se que puede ser, te agradeceria mucho si pudieras ayudarme.

    1. Mouse dice:

      es problema de rutas, verifica que estas importando las librerías correctamente

  3. Ronald dice:

    Que buen Post, hay forma de agregar a jaspereport con las librerias ZXing (core-2.3.0.jar y zxing-j2se-1.7.jar?

    1. Mouse dice:

      si, ya hay un post sobre esto 🙂

  4. Celina dice:

    Sabes como quitarle los margenes o poner los margenes en 0

  5. Juan Castaneda dice:

    Jmouse que interesante, requiero su ayuda o la persona que me pueda guiar, estoy tomando el codigo para implementarlo dentro de un JDesktopPane pero no he podido hacer que corra, porque solo es un Frame. agradesco su ayuda.

  6. Berceliuz dice:

    hola JC-Mouse buen tuto …. ya que me sirve para hacer un pequeño proyecto… pero como haría para hacer el proceso inverso … pasar de la imagen al texto… gracias

    1. Mouse dice:

      necesitas un lector de codigos, puedes usar el que viene con tu dispositivo android, hay un tuto sobre eso 🙂 buscalo si 🙂

  7. hola JC Mouse me gusto mucho porque me ayuda a darme una idea en un proyecto que estoy haciendo PERO TENGO UNA GRAN DUDA Y NO ENCUENTRO RESULTADOS NI SEMEJANZAS, lo que quiero hacer es pasarle un formulario en vez de solo una caja de texto a mi qr, COMO LE PUEDO HACER?
    es decir al hacer la lectura del código qr quiero que se visualice lo que yo había guardado en un formulario, que al escanearlo se muestre con un formato bien estructurado, como puedo hacerle,AYUDENMEE PORFAVOOOR 🙁 , es de vida o muerte este proyecto 🙁

    1. Mouse dice:

      QR solo almacena texto plano, todo dependería de tu APP que lea esos datos del QR y los interprete de X o Y manera

      1. no entiendo muy bien, la vdd no soy tan avanzado pero me gustaria aprenderlo, podrias hacer un tutorial de ello?

  8. Quino dice:

    Hola,
    necesito hacer los margenes mas pequeños o eliminarlos.
    ¿Alguien sabe como hacerlo?
    Gracias

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

En muchas ocasiones es necesaria la personalización de componentes java para que estos se adecuen a nuestros requerimien...

En este post mostramos como personalizar el Header (encabezado) de un componente JTable en Java colocando iconos, centra...

El JTable de Java es un gran componente para mostrar datos en una tabla de una forma rápida y sencilla, sin embargo en v...

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

Herramientas

Generador de Enlaces a Whatsapp