暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JAVA生成二维码

大黄的Java笔记 2020-09-07
155


点击上方蓝字 关注我们!


什么是二维码?


二维条码/二维码( 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;
}


@Override
public int getHeight() {
return bufferedImage.getHeight();
}


@Override
public int getPixel(int arg0, int arg1) {
return bufferedImage.getRGB(arg0, arg1);
}


@Override
public 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笔记



点下在看,你最好看


文章转载自大黄的Java笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论