在Java中用Zxing阅读QRCode

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

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

public class BarCodeDecode { /** * @param args */ public static void main(String[] args) { try { String tmpImgFile = "D:\\FormCode128.TIF"; Map tmpHintsMap = new EnumMap(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 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的图像。

在此处输入图像描述在此处输入图像描述

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

奇怪的是你的代码对我有用,但我必须删除以下提示。

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

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

谢谢!

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

作者正在使用ZXing(Zebra Crossing Library),您可以从这里下载它,用于本教程。

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 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)); } 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 Code库的Maven依赖:

  com.google.zxing core 2.2   com.google.zxing javase 2.2  

本规范对我有用。

 public static List ScanForBarcodes(string path) { return ScanForBarcodes(new Bitmap(path)); } public static List ScanForBarcodes(Bitmap bitmap) { // initialize a new Barcode reader. BarcodeReader reader = new BarcodeReader { TryHarder = true, // TryHarder is slower but recognizes more Barcodes PossibleFormats = new List // 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); } 

你用过这个 (ZXing.Net)Lib吗?

Interesting Posts