一、导入jar包(在工程中可以导入依赖)
在一个普通的java项目中,我们需要导入相关的jar包来生成和解析二维码,但是在一个maven工程等等的web项目中,我们可以通过带入相关依赖来实现。
jar包链接: https://pan.baidu.com/s/1Vk6QnyFWQuMxm85RsMOrAg
提取码:9nbk
如果添加依赖的话,可以导入下面的Zxing依赖:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
下面我以导包为例分别来演示生成、解析二维码。
二、生成二维码
代码:
package com.qrcode;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class CreatQRCode {
public static void main(String[] args) throws IOException {
//定义二维码的相关参数
int size = 300;//尺寸
String content = "第一个二维码";//二维码的内容
//二维码要生成的数据参数
Hashtable<EncodeHintType, Object> hits = new Hashtable<EncodeHintType, Object>();
//容错级别是最高级别
hits.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);
//内容的字符集
hits.put(EncodeHintType.CHARACTER_SET,"UTF-8");
//二维码的内容
hits.put(EncodeHintType.MARGIN, 1);
try {
//格式输出流
MultiFormatWriter out = new MultiFormatWriter();
//创建二维码矩阵
BitMatrix bitMatrix = out.encode(content, BarcodeFormat.QR_CODE, size, size,hits);
//创建一个图像缓冲区,用来存放二维码的图像数据
BufferedImage bufferQR = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
//将bitMatrix的数据写到缓冲区图像中
for(int i = 0; i < size ; i ++) {
for(int j = 0; j < size ; j++) {
//从bitMatrix取出每一个像素点的颜色 true为1 false为0
int rgb = bitMatrix.get(i, j)?0xFF000000:0xFFFFFFFF;
//设置bufferQR对应的位置颜色和bitMatrix一致
bufferQR.setRGB(i, j, rgb);
}
}
//添加logo,就是二维码中间的那个图片
File logo = new File("本地图片的地址");
Image image = ImageIO.read(logo);
Image src = image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
//在缓冲区图像上绘制logo
Graphics2D g = bufferQR.createGraphics();
int x = (size-src.getWidth(null))/2;
int y = (size-src.getHeight(null))/2;
g.drawImage(src, x, y,null);
//圆角矩形
Shape shape = new RoundRectangle2D.Float(x,y,60,60,6,6);
g.setStroke(new BasicStroke(1f));
g.setColor(Color.gray);
g.draw(shape);
g.dispose();
//生成图像位置,我这是生成到本地E盘,文件名为QR.png
File file = new File("E:\\QR.png");
//将内存中的图像写到文件
ImageIO.write(bufferQR,"png",file);//对应上面的文件类型
} catch (WriterException e) {
e.printStackTrace();
}
}
}
生成的二维码:
因为是采用的google的相关jar包,所以用微信扫的时候需要跳转查看。
三、解析二维码
代码演示:
package com.qrcode;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
public class ReadQRCode {
public static void main(String[] args) throws Exception {
try {
//得到图片并存入文件
File file = new File("E:\\QR.png");
//将图片文件转换成内存缓冲区图像
BufferedImage buffer = ImageIO.read(file);
//创建数据源对象
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(buffer);
//创建一个二值化器对象
HybridBinarizer binarizer = new HybridBinarizer(source);
//使用二值化器得到二进制图像
BinaryBitmap bitmap = new BinaryBitmap(binarizer);
//定义解析标准参数
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET,"UTF-8");
//开始解析二进制图像
MultiFormatReader reader = new MultiFormatReader();
//开始解析,获得解析的结果
Result rs = reader.decode(bitmap,hints);
//提取数据
String msg = rs.getText();
System.out.println(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果: