工具類:java
package com.wfz.zxing; import com.google.zxing.*; 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; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.Hashtable; import java.util.Map; /** * Created by Liang on 5/3/2017. */ public class ZxingUtils { /** * 生成二維碼 * * @param contents * @param width * @param height * @param imgPath */ public void encodeQRCode(String contents, int width, int height, String imgPath) { Map<EncodeHintType, Object> hints = new Hashtable<>(); // 指定糾錯等級 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 指定編碼格式 hints.put(EncodeHintType.CHARACTER_SET, "GBK"); try { BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); MatrixToImageWriter.writeToStream(bitMatrix, "png", new FileOutputStream(imgPath)); } catch (Exception e) { e.printStackTrace(); } } /** * 解析二維碼 * * @param imgPath * @return */ public String decodeQRCode(String imgPath) { BufferedImage image = null; Result result = null; try { image = ImageIO.read(new File(imgPath)); if (image == null) { System.out.println("the decode image may be not exit."); } LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Map<DecodeHintType, Object> hints = new Hashtable<>(); hints.put(DecodeHintType.CHARACTER_SET, "GBK"); result = new MultiFormatReader().decode(bitmap, hints); return result.getText(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 生成條形碼 * * @param contents * @param width * @param height * @param imgPath */ // int width = 105, height = 50; 長度很容易報錯:NotFoundException public void encodeBarCode(String contents, int width, int height, String imgPath) { int codeWidth = 3 + // start guard (7 * 6) + // left bars 5 + // middle guard (7 * 6) + // right bars 3; // end guard codeWidth = Math.max(codeWidth, width); try { BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.EAN_13, codeWidth, height, null); MatrixToImageWriter.writeToStream(bitMatrix, "png", new FileOutputStream(imgPath)); } catch (Exception e) { e.printStackTrace(); } } /** * 解析條形碼 * * @param imgPath * @return */ public String decodeBarCode(String imgPath) { BufferedImage image = null; Result result = null; try { image = ImageIO.read(new File(imgPath)); if (image == null) { System.out.println("the decode image may be not exit."); } LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); /* Map<DecodeHintType, Object> hints = new Hashtable<>(); hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); result = new MultiFormatReader().decode(bitmap, hints);*/ result = new MultiFormatReader().decode(bitmap, null); return result.getText(); } catch (Exception e) { e.printStackTrace(); } return null; } }
測試:特別注意 高寬 容易報錯:NotFoundException工具
public static void main(String[] args) throws Exception { String imgPath = "D:\\test.png"; // 益達無糖口香糖的條形碼 String contents = "6923450657713"; int width = 105, height = 50; ZxingUtils handler = new ZxingUtils(); handler.encodeBarCode(contents, width, height, imgPath); String barcode = handler.decodeBarCode(imgPath); System.out.println(barcode); handler.encodeQRCode("abc123中文@#\\", 200, 200, imgPath); String qrcode = handler.decodeQRCode(imgPath); System.out.println(qrcode); }
jar下載地址:zxing.jar測試