点击上方蓝字 关注我们!


什么是二维码?
二维条码/二维码( 2-dimensional bar code )是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。
黑色代表二进制的1,空白代表二进制的0.



二维码发展历史



一维条码是由一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。



二维条码是用某种特定的几何图形按一定规律在平面(二维方向)上分布的条、空相间的图形来记录数据符号信息。




二维码的分类
二维条码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型:
1、线性堆叠式二维码
编码原理∶建立在一维条码基础之上,按需要堆积成两行或多行。

2、矩阵式二维码(最常用)
在矩阵相应元素位置上,用点(方点、圆点或其他形状)
的出现表示二进制“1”,点的不出现表示二进制的“O”

QR code 是使用最广泛的二维码,我们下面将讲解如何用JAVA生成QR code类型的二维码
3、邮政码
邮政码通过不同长度的条进行编码,主要用于邮件编码,
如:POSTNET、BPO 4-STATE。



二维码的优缺点
优点
高密度编码
信息容量大
编码范围广
容错能力强
译码可靠性高
可引入加密措施
缺点
二维码技术成为手机病毒,钓鱼网站传播的新渠道
信息泄露
但总体来说:优点是大于缺点的


JAVA生成二维码方法:第三方Jar如zxing\qrcodejar,javascript如jquery\qrcode.js,下面分别介绍用这几种方法生成和解析二维码。



一、使用zxing生成和解析二维码
准备工作:
https://github.com/zxing/

点击zxing----->releases进行下载,解压
在eclipse中新建一个java项目,把解压文件中的core文件夹和javase文件夹下的com包复制,导出为JAR包,后面我们都基于该JAR进行二维码的开发。
打包过程不详细讲解,如有疑问可在后台留言获取打包好的JAR包文件
新建一个JAVA项目,引入我们导出的JAR包
编写以下代码即可生成一张二维码
//生成二维码public class CreatQRCode {public static void main(String[] args) {int width = 300;int height = 300;String format = "png";//图片格式String content = "大黄的JAVA笔记";//二维码扫出来的内容//定义二维码的参数HashMap hints= new HashMap();hints.put(EncodeHintType.CHARACTER_SET,"utf-8");//定义字符集编码hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.M);//定义二维码的大小 清晰程度。(M,L,H)hints.put(EncodeHintType.MARGIN,2);//设置二维码的边距//生成二维码try {BitMatrix bitMatrix= new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width, height, hints);Path file = new File("D:/大黄的JAVA笔记/1、JAVA生成二维码/code/img.png").toPath();//定义一个路径MatrixToImageWriter.writeToPath(bitMatrix, format, file);} catch (Exception e) {e.printStackTrace();}}
可以看到我们在D:/大黄的JAVA笔记/1、JAVA生成二维码/code路径下已经得到一张二维码

下面我们用zxing对上面生成的二维码进行解析。
代码如下:
public class ReaderQRCode {public static void main(String[] args) {try {//MultiFormatReader 多格式读取MultiFormatReader formatReader = new MultiFormatReader();File file = new File("D:/大黄的JAVA笔记/1、JAVA生成二维码/code/img.png");//读取图片buffer中BufferedImage bufferedImage = ImageIO.read(file);//BinaryBitmap 二进制位图//HybridBinarizer 混合二值化器//BufferedImageLuminanceSource 图像缓存区 亮度 资源BinaryBitmap binaryBitmap =new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(bufferedImage)));//定义二维码参数HashMap hashMap = new HashMap();hashMap.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码方式Result result = formatReader.decode(binaryBitmap,hashMap);System.out.println("解析结果:"+result.toString());System.out.println("二维码格式类型:"+result.getBarcodeFormat());//BarcodeFormat 条形码格式System.out.println("二维码文本内容:"+result.getText());} catch (Exception e) {e.printStackTrace();}}
解析结果:




二、使用QRcode生成和解析二维码
准备工作
生成:http://www.swetake.com/qrcode/index-e.html/
读取:https://osdn.jp/projects/qrcode/
下载java对应的版本,得到我们所需要的JAR包,分别命名为Qrcode_A.jar,qrcode_B.jar
QRcode生成二维码:
同样,我们新建JAVA项目,导入我们准备好的JAR包,
编写以下代码,即可获取生成的二维码。
public class CreatQRcode {public static void main(String[] args) {Qrcode x = new Qrcode();//通过Qrcode这个jar包设置二维码的一些属性x.setQrcodeErrorCorrect('M');//纠错等级为M级x.setQrcodeEncodeMode('B');//N代表数字 A代表a-z B代表其他内容//Qrcode的版本号 1-40//从21x21(版本1),到177x177(版本40),每一版本符号比前一版本每边增加4个模块。int version=7;x.setQrcodeVersion(version);String qrData= "大黄的JAVA笔记";//画的长度根据版本的不同,大小不同, 下面的长度计算公式固定int width = 67+12*(version-1);int height = 67+12*(version-1);//BufferedImage.TYPE_INT_RGB 指定图片的RGB值为int型 的 8位BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//Graphics2D 是java的画图工具Graphics2D gs = bufferedImage.createGraphics();gs.setBackground(Color.pink);//设置背景为白色gs.setColor(Color.black);//设置颜色为黑色gs.clearRect(0, 0, width, height);//存储画板的内容int pixOff = 2;//偏移量//往画板填充内容byte[] d =qrData.getBytes();if (d.length>0 && d.length <120){boolean[][] s = x.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();bufferedImage.flush();try {ImageIO.write(bufferedImage, "png", new File("D:/大黄的JAVA笔记/1、JAVA生成二维码/code/imgQRcode.png"));} catch (IOException e) {e.printStackTrace();}}

QRcode解析二维码
代码如下:
public class ReaderQRCode {public static void main(String[] args) {File file = new File("D:/大黄的JAVA笔记/1、JAVA生成二维码/code/imgQRcode.png");BufferedImage bufferedImage;try {bufferedImage = ImageIO.read(file);QRCodeDecoder codeDecoder = new QRCodeDecoder();String result = new String(codeDecoder.decode(new MyQRCodeImage(bufferedImage)),"gb2312");System.out.println(result);} catch (IOException e) {e.printStackTrace();}}
另外需实现QRCodeImage这个接口
package com.dahuang.qrcode;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;public class MyQRCodeImage implements QRCodeImage {BufferedImage bufferedImage;public MyQRCodeImage(BufferedImage bufferedImage){this.bufferedImage = bufferedImage;}@Overridepublic int getHeight() {return bufferedImage.getHeight();}@Overridepublic int getPixel(int arg0, int arg1) {return bufferedImage.getRGB(arg0, arg1);}@Overridepublic int getWidth() {return bufferedImage.getWidth();}}
这样,我们就能得到解析的结果




三、使用jQuery-qrcode在线生成二维码
准备工作:
网址:https://github.com/jeromeetienne/jquery-qrcode/
在该网址下载我们所需要的JS文件:jquery.min.js和jquery.qrcode.min.js
新建JAVA WEB项目,导入我们的JS,新建JSP页面。
编写以下代码即可在线生成二维码。
<%@ 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><script type="text/javascript" src ="<%=request.getContextPath() %>/js/jquery.min.js"></script><script type="text/javascript" src ="<%=request.getContextPath() %>/js/jquery.qrcode.min.js"></script></head><body>生成的二维码如下:<br><div id = "qrcode"></div><script type="text/javascript">//二选一jQuery('#qrcode').qrcode("大黄的JAVA笔记");</script></body></html>




注:该笔记整理于慕课网(https://www.imooc.com/),如有侵权,请联系作者删除。
微信公众号:大黄的JAVA笔记



点下在看,你最好看




