Java Generar Codigo QR

By | 09/14/2015

Te explico como generar Código QR en Java utilizando esta librería zxing.

Como siempre, nada es mejor que un ejemplo…

Este simple ejemplo contiene dos metodos, uno para crear una imagen con el QR a partir de un texto y otro para leer el QR desde la imagen.

Necesitamos estas dependencias en nuestro pom.xml de Maven

    <dependencies>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.2.1</version>
        </dependency>
    </dependencies>

 

Vamos al ejemplo:

 

import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;

/**
 * Created by gustavo.peiretti on 14/09/2015.
 */
public class TestQRCode {

    public static void main(String[] args) {

        TestQRCode qr = new TestQRCode();
        File f = new File("qrCode.png");
        String text = "All you need is love, love. Love is all you need. Beatles";

        try {

            qr.generateQR(f, text, 300, 300);
            System.out.println("QRCode Generated: " + f.getAbsolutePath());

            String qrString = qr.decoder(f);
            System.out.println("Text QRCode: " + qrString);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public File generateQR(File file, String text, int h, int w) throws Exception {

        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix matrix = writer.encode(text, com.google.zxing.BarcodeFormat.QR_CODE, w, h);

        BufferedImage image = new BufferedImage(matrix.getWidth(), matrix.getHeight(), BufferedImage.TYPE_INT_RGB);
        image.createGraphics();

        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, matrix.getWidth(), matrix.getHeight());
        graphics.setColor(Color.BLACK);

        for (int i = 0; i < matrix.getWidth(); i++) {
            for (int j = 0; j < matrix.getHeight(); j++) {
                if (matrix.get(i, j)) {
                    graphics.fillRect(i, j, 1, 1);
                }
            }
        }

        ImageIO.write(image, "png", file);

        return file;

    }


    public String decoder(File file) throws Exception {

        FileInputStream inputStream = new FileInputStream(file);

        BufferedImage image = ImageIO.read(inputStream);

        int width = image.getWidth();
        int height = image.getHeight();
        int[] pixels = new int[width * height];

        LuminanceSource source = new BufferedImageLuminanceSource(image);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

        // decode the barcode
        QRCodeReader reader = new QRCodeReader();
        Result result = reader.decode(bitmap);
        return new String(result.getText());
    }
}

Algo mas de información en http://code.google.com/p/zxing/

Compartir esto:

13 thoughts on “Java Generar Codigo QR

  1. jonathan

    Hola, muy buena y útil información, pero será posible agregar texto debajo del qr?
    muchas Gracias…

    Reply
  2. jonathan

    Hola. muy buena y útil información… pero me podrían ayudar por favor a cómo podría ponerle texto a la imagen qr?
    es decir. tengo mi imágen qr perfecta, pero si la quisiera imprimir no sabría que texto es… hay alguna forma de añadirle algún texto debajo del qr?

    Reply
  3. Dandel

    Las librerias del link que provees no funcionan. Podrias poner el link de descarga de las librerias (.jar) ? Yo descarge las librerias por mi cuenta, pero no me sale error en “TestQRCode q = newTestQRCode()”;

    Reply
    1. Gustavo Post author

      Estan puestas las dependencias. sldos.

      Reply
  4. Ignacio Aguilar

    ¿Saben si hay forma de que la imagen generada (QR) no tenga margenes en blanco?, es decir, que el código llene toda la imagen. Actualmente la imagen generada tiene un contorno en blanco y necesito que la imagen sea “llena”. ¿Alguna idea?

    Reply
  5. Carlos

    Hola,

    Gracias por compartir este código. Así como mencionan, yo tampoco encontré el archivo JAR, tuve que importar todas las clases para implementarlo. Ya busqué en el zip de la página y no está, ¿Nos podrías ayudar con el JAR? Gracias de antemano.

    Reply
  6. Carlos

    Hola buen día, me podrían pasar las librerías por favor porque no las puedo descargar del sitio gracias.

    Reply
  7. Rudy

    Hola, tengo un problema, el código me manda un error que dice lo siguiente:
    java.lang.VerifyError: Cannot inherit from final class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    Exception in thread “main”

    me podrías decir que está mal

    Reply
    1. Gustavo Post author

      Verifica las versiones de tus jar. ¿Que version usas?

      Reply
  8. francisco

    hola no encuentro los jar qe mencionas, me podiras ayudar?

    Reply
  9. Khristian Morales

    Hola excelente post y disculpa una pregunta en el caso de android como seria xq el metodo QRCodeWriter writer = new QRCodeWriter(); lo inpide si ´pudieras ayudarme con esto te lo agradeceria infinitamente GRACIAS

    Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *