使用爪哇Zxing阅读QRCode

2022-09-03 02:03:06

关于使用Zxing的一些问题...

我编写以下代码以从图像中读取条形码:

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

我尝试阅读以下两个包含code128和QRCode的图像。

enter image description hereenter image description here

它可以适用于 code128,但不适用于 QRCode。任何人都知道为什么...


答案 1

请通过此链接获取完整的教程。这个代码的作者是Joe。我还没有开发这个代码,所以我只是在做复制粘贴,以确保在链接断开的情况下它可用。

作者正在使用ZXing(斑马穿越库),您可以从此处下载,用于本教程。

Java中的QR码写入和读取程序:

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

ZXing QR码库的Maven依赖项:

<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>

答案 2

奇怪的是,你的代码适合我,但我不得不删除以下提示。

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

当我的图像不是纯条形码时,这个提示打破了我的结果。

谢谢!


推荐