二维码学习(二):使用ZXing生成与解析二维码

生成二维码主要有三种技术:ZXing,qrcode和jQuery.qrcode。这里使用ZXing生成二维码。直接上代码吧:

package com.wjl.test;

import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.tzj.tsp.qrcode.BufferedImageLuminanceSource;
import com.tzj.tsp.qrcode.MatrixToImageWriter;

public class CreateQRCodeInZXing {

	/**
	 * 该类用来生成二维码
	 */
	public static void main(String[] args) {
		//1、定义二维码的大小、图片后缀名和内容
		int width = 300;
		int height = 300;
		
		//png比jpg的两个优点:1、png支持透明 2、png较小
		String format = "png";
		String contents = "使用ZXing生成二维码";
		System.out.println("生成二维码内容:"+contents);
		
		//2、定义二维码文件
		String filePath = "D:"+File.separator+"temp"+File.separator+"ZXing"+System.currentTimeMillis()+"."+format;
		File QRFile = new File(filePath);
		
		//3、生成二维码
		CreateQRCodeInZXing zXing = new CreateQRCodeInZXing();
		boolean flag = zXing.createQRCode(contents,width,height,QRFile);
		if(flag){//说明生成二维码成功
			//4、添加logo
			String logoPath = "D:"+File.separator+"temp"+File.separator+"logo.jpg";
			File logoFile = new File(logoPath);
			int resu = zXing.addLogoQRCode(QRFile, logoFile, format,2);
			if(resu==3){//添加logo成功
				//5、解析二维码
				String result = zXing.readQRCode(QRFile);
				System.out.println("解析二维码内容:"+result);
			}
		}
	}
	
	/**
	 * 该方法用来生成二维码
	 * @param contents:二维码内容
	 * @param width:二维码宽度
	 * @param height:二维码高度
	 * @param format:二维码图片后缀名
	 * @param QRFile:二维码图片文件
	 * @return boolean:true-生成成功 false-生成失败
	 * */
	public boolean createQRCode(String contents,int width,int height,File QRFile){
		boolean result = false;
		try{
			//生成矩阵  
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,getEncodeHints());
			MatrixToImageWriter.writeToFile(bitMatrix,QRFile);
			result = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 该方法用来读取二维码内容
	 * @param QRFile:二维码图片文件
	 * @return String:二维码内容 
	 * **/
	public String readQRCode(File QRFile){
		if(!QRFile.exists() || !QRFile.isFile()) return "";
		String result="";
		try{
			MultiFormatReader formatReader = new MultiFormatReader();
			//读取文件并识别成图片
			BufferedImage image = ImageIO.read(QRFile);
			BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
			Result result2 = formatReader.decode(binaryBitmap,getDecodeHints());
			result = result2.getText();
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	
	/**
	 * 给二维码图片添加Logo
	 * @param QRFile:二维码图片文件
	 * @param logoFile:logo文件对象
	 * @param format:添加logo后的二维码文件后缀名
	 * @param logoConfig:logo设置
	 * @param postion:1-右下角 非1-中间
	 * @return int:1-找不到二维码文件或logo文件 2-生成成抛出异常 3-生成成功
	 */
	public int addLogoQRCode(File QRFile,File logoFile,String format,int position) {
		int result = 3;
		try {
			//二维码文件或logo文件不存在或不是文件
			if (!QRFile.exists() || !QRFile.isFile() || !logoFile.exists() || !logoFile.isFile()) {
				return 1;
			}
			
			//读取二维码图片,并构建绘图对象
			BufferedImage image = ImageIO.read(QRFile);
			Graphics2D g = image.createGraphics();

			//读取Logo图片
			BufferedImage logo = ImageIO.read(logoFile);
			//设置logo的大小,此处设置为二维码图片的20%,因为过大会盖掉二维码
			int widthLogo = logo.getWidth(null) > image.getWidth() * 2 / 10 ? (image
					.getWidth() * 2 / 10) : logo.getWidth(null), heightLogo = logo
					.getHeight(null) > image.getHeight() * 2 / 10 ? (image
					.getHeight() * 2 / 10) : logo.getWidth(null);

			// 计算图片放置位置
			int x=0,y=0;
			if(position==1){//logo放在右下角
				x = (image.getWidth() - widthLogo);
				y = (image.getHeight() - heightLogo);
			}else{//logo放在中心
				x = (image.getWidth() - widthLogo) / 2; 
				y =(image.getHeight() - heightLogo) / 2;
			}
			
			// 开始绘制图片
			g.drawImage(logo, x, y, widthLogo, heightLogo, null);
			g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
			g.setStroke(new BasicStroke(2));
			g.drawRect(x, y, widthLogo, heightLogo);

			g.dispose();
			logo.flush();
			image.flush();

			ImageIO.write(image,format,QRFile);
		} catch (Exception e) {
			result = 2;
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 该方法用来生成二维码时设置二维码的编码、纠错等级等参数
	 * */
	public HashMap getEncodeHints(){
		HashMap hints = new HashMap();
		hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");//设置编码
		//二维码的容错等级(纠错能力)分四种:
		//L:约可纠错7%的数据 M:约可纠错15%的数据  Q:约可纠错25%的数据  H:约可纠错30%的数据 
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置容错等级(纠错能力)
		hints.put(EncodeHintType.MARGIN,2);//边距(即二维码结构图中的空白区)
		return hints;
	}
	
	/**
	 * 该方法用来解析二维码时设置二维码的编码等参数
	 * */
	public HashMap getDecodeHints(){
		HashMap hints = new HashMap();
		hints.put(DecodeHintType.CHARACTER_SET,"UTF-8");//设置编码
		return hints;
	}
}

需要的jar包:core-2.2.jar

猜你喜欢

转载自1017401036.iteye.com/blog/2316958