Search code examples
javaqr-codezxing

Find QR code in image and decode it using Zxing


First of all, I read through all those topics how to use Zxing in Java but always got errors with missing com.google.zxing.client.j2se.* (I loaded the zxing core-3.2.1.jar in eclipse and all other zxing packages work unless j2se) or just found solutions for creating qr images...

My aim is to write one single method which gets an image file finds the qr code in this image, decodes the qr code and returns the string, basically it should be something like the following:

import com.google.zxing.*;

public class QRCode {

    /*
     * ...
     */

    public String getDecodedString(SomeStandardImageType photo){
        // detect the qr code in a photo
        // create qr image from detected area in photo
        // decode the new created qr image and return the string
        return "This is the decoded dataString from the qr code in the photo";
    }

}

To sum up the method should get an image file like the following

enter image description here

and should return the url or if failed just "".

The code should be compatible with Zxing 3.2.1.

Edit: The question is solved. For others who are interested in this I want to say that it is important to add both external jars core-3.2.1.jar and javase-3.2.1.jar to external jars. The answer by me works without the latter but depends on android image libs.


Solution

  • here is the code to create the Qr-Code and read Message from Qr-code

    1. you need the build the zxing library

    2. main describe the qr-code creation and qr-code extraction

      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<EncodeHintType, ErrorCorrectionLevel> hintMap = new HashMap<EncodeHintType, ErrorCorrectionLevel>();
          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();
        }
      }