web-dev-qa-db-fra.com

Lecture de QRCode avec Zxing en Java

Quelques questions sur l'utilisation de Zxing ...

J'écris le code suivant pour lire le code à barres d'une image:

public class BarCodeDecode 
{
    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        try
        {
            String tmpImgFile = "D:\\FormCode128.TIF";

            Map<DecodeHintType,Object> tmpHintsMap = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);
            tmpHintsMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            tmpHintsMap.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class));
            tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);

            File tmpFile = new File(tmpImgFile);
            String tmpRetString = BarCodeUtil.decode(tmpFile, tmpHintsMap);
            //String tmpRetString = BarCodeUtil.decode(tmpFile, null);
            System.out.println(tmpRetString);
        }
        catch (Exception tmpExpt)
        {
            System.out.println("main: " + "Excpt err! (" + tmpExpt.getMessage() + ")");
        }
        System.out.println("main: " + "Program end.");
    }

}

public class BarCodeUtil 
{
    private static BarcodeFormat DEFAULT_BARCODE_FORMAT = BarcodeFormat.CODE_128;

    /**
      * Decode method used to read image or barcode itself, and recognize the barcode,
      * get the encoded contents and returns it.
      * @param whatFile image that need to be read.
      * @param config configuration used when reading the barcode.
      * @return decoded results from barcode.
      */
     public static String decode(File whatFile, Map<DecodeHintType, Object> whatHints) throws Exception 
     {
         // check the required parameters
         if (whatFile == null || whatFile.getName().trim().isEmpty())
             throw new IllegalArgumentException("File not found, or invalid file name.");
         BufferedImage tmpBfrImage;
         try 
         {
             tmpBfrImage = ImageIO.read(whatFile);
         } 
         catch (IOException tmpIoe) 
         {
             throw new Exception(tmpIoe.getMessage());
         }
         if (tmpBfrImage == null)
             throw new IllegalArgumentException("Could not decode image.");
         LuminanceSource tmpSource = new BufferedImageLuminanceSource(tmpBfrImage);
         BinaryBitmap tmpBitmap = new BinaryBitmap(new HybridBinarizer(tmpSource));
         MultiFormatReader tmpBarcodeReader = new MultiFormatReader();
         Result tmpResult;
         String tmpFinalResult;
         try 
         {
             if (whatHints != null && ! whatHints.isEmpty())
                 tmpResult = tmpBarcodeReader.decode(tmpBitmap, whatHints);
             else
                 tmpResult = tmpBarcodeReader.decode(tmpBitmap);
             // setting results.
             tmpFinalResult = String.valueOf(tmpResult.getText());
         } 
         catch (Exception tmpExcpt) 
         {
             throw new Exception("BarCodeUtil.decode Excpt err - " + tmpExcpt.toString() + " - " + tmpExcpt.getMessage());
         }
         return tmpFinalResult;
    }
}

J'essaie de lire les deux images suivantes qui contiennent le code128 et le QRCode.

enter image description hereenter image description here

Cela peut fonctionner pour le code128 mais pas pour le QRCode . Tout le monde sait pourquoi ... 

12
Johnny

Curieusement, votre code fonctionne pour moi, mais je devais supprimer cet indice.

tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);

Lorsque mon image n'est pas un code-barres pur, cette indication a cassé mon résultat.

Je vous remercie!

7
Diego Mariano

Veuillez passer par ce lien link pour terminer le didacticiel. L'auteur de ce code est Joe. _ {Je n'ai pas développé ce code} _, je suis donc en train de copier le coller pour m'assurer qu'il est disponible si le lien est cassé.

L'auteur utilise ZXing (Zebra Crossing Library), vous pouvez le télécharger depuis ici , pour ce tutoriel.

Programme d'écriture et de lecture de code QR en Java:

package com.javapapers.Java;


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 {

  public static void main(String[] args) throws WriterException, IOException,
      NotFoundException {
    String qrCodeData = "Hello World!";
    String filePath = "QRCode.png";
    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));

  }

  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, hintMap);
    MatrixToImageWriter.writeToFile(matrix, filePath.substring(filePath
        .lastIndexOf('.') + 1), new File(filePath));
  }

  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();
  }
}

Dépendance Maven de la bibliothèque de codes QR ZXing:

<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>core</artifactId>
  <version>2.2</version>
</dependency>

<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>javase</artifactId>
  <version>2.2</version>
</dependency>
6
Akshay Taru

Ce code a fonctionné pour moi.

public static List<string> ScanForBarcodes(string path)
{
  return ScanForBarcodes(new Bitmap(path));
}

public static List<string> ScanForBarcodes(Bitmap bitmap)
{
  // initialize a new Barcode reader.
  BarcodeReader reader = new BarcodeReader
  {
    TryHarder = true, // TryHarder is slower but recognizes more Barcodes
    PossibleFormats = new List<BarcodeFormat> // in the ZXing There is an Enum where all supported barcodeFormats were contained
    {
      BarcodeFormat.CODE_128, 
      BarcodeFormat.QR_CODE,
      //BarcodeFormat. ... ;
    }
  };
  return reader.DecodeMultiple(bitmap).Select(result => result.Text).ToList(); // return only the barcode string.
                                                                               // If you want the full Result use: return reader.DecodeMultiple(bitmap);
}

Avez-vous utilisé this (ZXing.Net) Lib?

0
Wr4thon