Saltar al contenido

Encuentra el código QR en la imagen y decodifícalo usando Zxing

Solución:

aquí está el código para crear el código Qr y leer el mensaje del código Qr

  1. necesitas construir la biblioteca zxing

  2. principal describe la creación de código qr y la extracción de código qr

    package com.attendance.mark;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Result;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    public class QRCode 
    
        /**
         * 
         * @param args 
         * @throws WriterException
         * @throws IOException
         * @throws NotFoundException
         */
      public static void main(String[] args) throws WriterException, IOException,
          NotFoundException 
        String qrCodeData = "student3232_2015_12_15_10_29_46_123";
        String filePath = "F:\Opulent_ProjectsDirectory_2015-2016\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\AttendanceUsingQRCode\QRCodes\student3232_2015_12_15_10_29_46_123";
        String charset = "UTF-8"; // or "ISO-8859-1"
        Map hintMap = new HashMap();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
    
        createQRCode(qrCodeData, filePath, charset, hintMap, 200, 200);
        System.out.println("QR Code image created successfully!");
    
        System.out.println("Data read from QR Code: "
            + readQRCode(filePath, charset, hintMap));
    
      
    
      /***
       * 
       * @param qrCodeData
       * @param filePath
       * @param charset
       * @param hintMap
       * @param qrCodeheight
       * @param qrCodewidth
       * @throws WriterException
       * @throws IOException
       */
      public static void createQRCode(String qrCodeData, String filePath,
          String charset, Map hintMap, int qrCodeheight, int qrCodewidth)
          throws WriterException, IOException 
        BitMatrix matrix = new MultiFormatWriter().encode(
            new String(qrCodeData.getBytes(charset), charset),
            BarcodeFormat.QR_CODE, qrCodewidth, qrCodeheight);
        MatrixToImageWriter.writeToFile(matrix, filePath.substring(filePath
            .lastIndexOf('.') + 1), new File(filePath));
      
    
      /**
       * 
       * @param filePath
       * @param charset
       * @param hintMap
       * 
       * @return Qr Code value 
       * 
       * @throws FileNotFoundException
       * @throws IOException
       * @throws NotFoundException
       */
      public static String readQRCode(String filePath, String charset, Map hintMap)
          throws FileNotFoundException, IOException, NotFoundException 
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
            new BufferedImageLuminanceSource(
                ImageIO.read(new FileInputStream(filePath)))));
        Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap, hintMap);
        return qrCodeResult.getText();
      
    
    

Ahora leo más sobre Zxing y el siguiente código funcionará con Zxing v3.2.1 (este código funciona sin javase lib)

// Imports
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

// Interesting method
public static String decodeQRImage(String path) 
    Bitmap bMap = BitmapFactory.decodeFile(path);
    String decoded = null;

    int[] intArray = new int[bMap.getWidth() * bMap.getHeight()];
    bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(),
            bMap.getHeight());
    LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(),
            bMap.getHeight(), intArray);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

    Reader reader = new QRCodeReader();
    try 
        Result result = reader.decode(bitmap);
        decoded = result.getText();
     catch (NotFoundException e) 
        e.printStackTrace();
     catch (ChecksumException e) 
        e.printStackTrace();
     catch (FormatException e) 
        e.printStackTrace();
    
    return decoded;

Este código funciona bien para mí. Espero que ayude a importar los paquetes necesarios y debería funcionar

public class QR_Reader extends JFrame implements Runnable, ThreadFactory 

private static final long serialVersionUID = 6441489157408381878L;

private Executor executor = Executors.newSingleThreadExecutor(this);

private Webcam webcam = null;
private WebcamPanel panel = null;
String s;

public QR_Reader() 
    super();
    setLayout(new FlowLayout());
    setTitle("Reading QR Code");
    Dimension size = WebcamResolution.QVGA.getSize();
    webcam = Webcam.getWebcams().get(0);
    webcam.setViewSize(size);
    panel = new WebcamPanel(webcam);
    panel.setPreferredSize(size);
    add(panel);
    pack();
    setVisible(true);
    setResizable(false);
    executor.execute(this);

@Override
public void run() 

    do 
        try 
            Thread.sleep(100);
         catch (InterruptedException e) 
            e.printStackTrace();
        

        Result result = null;
        BufferedImage image = null;

        if (webcam.isOpen()) 

            if ((image = webcam.getImage()) == null) 
                continue;
            

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

            try 
                result = new MultiFormatReader().decode(bitmap);
             catch (NotFoundException e) 
                // fall thru, it means there is no QR code in image
            
        

        if (result != null) 
            String time_then=result.getText();  //this is the text extracted from QR CODE
            webcam.close();
            this.setVisible(false);
            this.dispose();
            try 
                new Compare().C_Main(time_then);
             catch (ParseException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        

     while (true);


@Override
public Thread newThread(Runnable r) 
    Thread t = new Thread(r, "example-runner");
    t.setDaemon(true);
    return t;


void QRC_Main() 
    new QR_Reader();


valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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