多种方式实现二维码

最近和一位前辈学习生成二维码(Zxing,Qrcode,Jquery)3种方式,整理了一份简单资料分享给大家。本人编码阅历有限,下文代码中存在编码规范问题,还请多多留言。

下文所提到的工具包:双击免费工具包下载

提取码:gm03

Zxing

谷歌推出的一款开源项目。

需要包:

zxing-3.3.2.jar

创建二维码

package student.com.zxing;

import java.io.File;

import java.nio.file.Path;
import java.util.HashMap;
import java.util.UUID;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 
 * @author Bad Written
 *
 */
public class CreateZxing {
	
	/**
	 * 
	 * @param content
	 * @param width
	 * @param height
	 * @param charsetName
	 * @return BitMatrix对象(存储将要生成的二维码的字节数据)
	 * @throws Exception 
	 */
	public static BitMatrix createBitMatrix(String content, int width, int height,String charsetName) throws Exception{
		//要生成什么格式的二维码
		BitMatrix bitMatrix=null;
		//二维码当中要存储什么信息
		HashMap<EncodeHintType, Comparable> hints = new HashMap<EncodeHintType, Comparable>();
		hints.put(EncodeHintType.CHARACTER_SET, charsetName);
		//设置纠错率,分为L、M、H三个等级,等级越高,纠错率越高,但存储的信息越少
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
		//设置一下边距,默认是5
		hints.put(EncodeHintType.MARGIN, 2);
		bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
		return bitMatrix;
	}
	
	/**
	 * 
	 * @param content 内容
	 * @param format 图片格式
	 * @param width 图片宽
	 * @param height 高
	 * @param charsetName 编码格式
	 * @param filepath 文件路径
	 * @throws Exception
	 */
	public static void create(String content,String format, int width, int height,String charsetName,String filepath) throws Exception{
		BitMatrix bitMatrix=CreateZxing.createBitMatrix(content, width, height,charsetName);		
		File file=new File(filepath+File.separator+UUID.randomUUID().toString().replace("-", "")+"."+format);
		Path path = file.toPath();
		MatrixToImageWriter.writeToPath(bitMatrix, format, path);
		
	}
	
	public static void main(String[] args){
		System.out.println("开始");
		try{
			CreateZxing.create("Zxing生成二维码!","png",300,300,"utf-8","E:/code");
			System.out.println("成功");
		}catch(Exception e){
			e.printStackTrace();
		}
		
    }
}

 生成结果如图:

Zxing

读取二维码

package study.com.zxing;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

/**
 * 
 * @author Bad Written
 *
 */
public class ReadZxingCode {

	public static Result read(String filepath,String charsetName) throws IOException, NotFoundException{
		Result result=null;
		MultiFormatReader mfr=new MultiFormatReader();
		File file=new File(filepath);
		BufferedImage img=ImageIO.read(file);
		BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(img)));		
		HashMap hints = new HashMap();
		hints.put(EncodeHintType.CHARACTER_SET,charsetName);		
		result=mfr.decode(binaryBitmap,hints);
		return result;
	}
	
	public static void main(String[] args){
		System.out.println("开始");
		Result result;
		try {
			result = ReadZxingCode.read("E:/code/d4ebf9c4917f401da607df77ac50a346.png","utf-8");
			System.out.println(result.toString());
		} catch (NotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 QRcode

包:1.2\qrcode-1.2.jar

创建二维码

package study.com.qrcode;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;
/*
 * 基于Graphics2D画图工具
 */
public class CreateQRCode {
	
	/**
	 * 返回一个图片缓存
	 * 
	 * @param context 图片内容
	 * @param size 二维码版本
	 * @charsetName 编码格式
	 * @return
	 * @throws IOException
	 */
	private static BufferedImage createbuf(String context,int size,String charsetName) throws IOException{
		//二维码类
		Qrcode qr=new Qrcode();
		//纠错等级
		qr.setQrcodeErrorCorrect('M');
		//代表其他字符
		qr.setQrcodeEncodeMode('B');
		//设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
		qr.setQrcodeVersion(size);
		//二维码大小
		int width=67+12*(size-1);//公式
		int height=67+12*(size-1);
		//缓冲区图片
		BufferedImage bufimg=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//画图工具
		Graphics2D gs=bufimg.createGraphics();
		
		gs.setBackground(Color.WHITE);
		gs.setColor(Color.BLACK);
		//设置画板
		gs.clearRect(0, 0, width, height);
		//内容编码
		byte[] d=context.getBytes(charsetName);
		
		int pixoff=2;//偏移量
		// 输出内容> 二维码 
		if(d.length>0 && d.length<120){			
			boolean[][] s=qr.calQrcode(d);			
			for(int i=0;i<s.length;i++){				
				for(int j=0;j<s.length;j++){
					if(s[j][i]){
						gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
					}
				}
			}
		}
		gs.dispose();
		bufimg.flush();
		return bufimg;
	}
	
	/**
	 * 
	 * @param context 内容
	 * @param size   版本
	 * @param type  图片格式
	 * @param imgpath 图片路径
	 * @throws IOException
	 */
	public static void create(String context,int size,String type,String imgpath) throws IOException{
		BufferedImage bufimg=CreateQRCode.createbuf(context,size,"gb2312");		
		File file=new File(imgpath+File.separator+UUID.randomUUID().toString().replace("-", "")+"."+type);
		ImageIO.write(bufimg, type, file);	
	}
		
	public static void main(String[] args) {
		System.out.println("开始"+File.separator);
		try{
			CreateQRCode.create("Qrcode生成二维码", 7, "png", "E:/code");
			System.out.println("成功");
		}catch(IOException e){
			System.out.println("失败");
			e.printStackTrace();
		}		
	}
}

生成二维码如图:

Qrcode

读取二维码

主工具类 

package study.com.qrcode;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;

public class ReadQrCode {

	/**
	 * 
	 * @param filepath 文件路径
	 * @param charsetName 编码格式
	 * @return 解析出来结果
	 * @throws IOException
	 */
	public static String read(String filepath,String charsetName) throws IOException{
		String result=null;
		File file=new File(filepath);
		BufferedImage img=ImageIO.read(file);
		QRCodeDecoder qrCodeDecoder=new QRCodeDecoder();
		result=new String(qrCodeDecoder.decode(new QrCodeImgImp(img)),charsetName);				
		return result;
	}
	
	public static void main(String[] args) throws IOException{
		String str=ReadQrCode.read("E:/code/qrcode.png","gb2312");
		System.out.println("解析:"+str);
	}
	
}

副类

package study.com.qrcode;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class QrCodeImgImp implements QRCodeImage {

	BufferedImage bufimg;
	
	public QrCodeImgImp(BufferedImage bufimg){
		this.bufimg=bufimg;		
	}
	
	public int getHeight() {
		// TODO Auto-generated method stub
		return bufimg.getHeight();
	}

	public int getPixel(int arg0, int arg1) {
		// TODO Auto-generated method stub
		return bufimg.getRGB(arg0, arg1);
	}

	public int getWidth() {
		// TODO Auto-generated method stub
		return bufimg.getWidth();
	}

}

JQuery

导入相应的JS

jquery.qrcode.min.js
           jquery-3.3.1.min.js

生成二维码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>生成二维码</title>
	</head>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.qrcode.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
	$('#qrcode').qrcode(
		{
		    render : "canvas",    //设置渲染方式,有table和canvas,使用canvas方式渲染性能相对来说比较好  
		    text : "http://www.baidu.com",    //扫描二维码后显示的内容,可以直接填一个网址,扫描二维码后自动跳向该链接  
		    width : "200",               //二维码的宽度  
		    height : "200",         //二维码的高度  
		    background : "#ffffff",       //二维码的后景色  
		    foreground : "#000000",        //二维码的前景色  
		});
	}
)
</script>
	<body>
		生成二维码如下
		<center> 
			<div id="qrcode"></div>
		</center> 
			<h3>显示结束</h3>
	</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值