二维条形码的生成与解析

二维条形码的生成与解析

参考文章

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


package util.qrcode;

import java.awt.image.BufferedImage;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Hashtable;
import java.util.List;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
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 QRCodeUtils {

	/** 私有构造方法 */
	private QRCodeUtils() { super(); }
	
	private static final Hashtable<EncodeHintType, Object> ZXING_HINTS;
	
	static {
		ZXING_HINTS = new Hashtable<EncodeHintType, Object>();
		ZXING_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		ZXING_HINTS.put(EncodeHintType.CHARACTER_SET, "UTF-8");
	}
	
	/**
	 * 将二维码写入数据流
	 * 
	 * @param out 数据流
	 * @param lines 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToOutputStream(OutputStream out, List<String> lines, int width, int height) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < lines.size(); i ++) {
			sb.append(lines.get(i));
			if (i != lines.size() - 1) {
				sb.append("\n");
			}
		}
		writeToOutputStream(out, sb.toString(), width, height);
	}
	
	/**
	 * 将二维码写入数据流
	 * 
	 * @param out 数据流
	 * @param contents 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToOutputStream(OutputStream out, String contents, int width, int height) {
		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
			MatrixToImageWriter.writeToStream(bitMatrix, "png", out);
		} catch (WriterException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
	
	/**
	 * 将二维码写入文件
	 * 
	 * @param file 文件
	 * @param lines 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToFile(File file, List<String> lines, int width, int height) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < lines.size(); i ++) {
			sb.append(lines.get(i));
			if (i != lines.size() - 1) {
				sb.append("\n");
			}
		}
		writeToFile(file, sb.toString(), width, height);
	}
	
	/**
	 * 将二维码写入文件
	 * 
	 * @param file 文件
	 * @param contents 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToFile(File file, String contents, int width, int height) {
		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
			MatrixToImageWriter.writeToFile(bitMatrix, "png", file);
		} catch (WriterException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 解析二维码
	 * 
	 * @param image 图片
	 * @return 信息
	 */
	public static String decode(BufferedImage image) {
		Result result = null;
		LuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		try {
			result = new MultiFormatReader().decode(bitmap, ZXING_HINTS);
		} catch (NotFoundException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return result.getText();
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param file 图片
	 * @return 信息
	 */
	public static String decode(File file) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(file);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param input 图片
	 * @return 信息
	 */
	public static String decode(InputStream input) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(input);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param url 图片
	 * @return 信息
	 */
	public static String decode(URL url) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(url);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 关闭
	 * 
	 * @param closeable 关闭对象
	 */
	public static void closeQuietly(Closeable closeable) {
		if (closeable == null) return;
		try { closeable.close(); } catch (Exception e) {}
	}
}

猜你喜欢

转载自yingzhuo.iteye.com/blog/1858472
今日推荐