之前看了zxing的几个demo,发现封装的比较严重,因某些需要就没用它,只用了QRCODE这个jar,百度一下,轻松找到
纯Java项目结构如下
说明 :测试main方法有两块,一块是生成二维码,此代码里写的是放在d盘根目录,第二块是解析二维码,运行mian方法时,注释掉其中一个,如果要生成,就注释掉解析,反之,亦然。解析的代码片段里"File file = new File("D:/20170717145558602.png");",这个文件名是二维码的文件名,可以是你自己刚生成的,也可以是从其他地方获取的,要注意,不要直接引用下面的解析代码的file,因为你没有这个文件。
第一个类QRCodeEncoderHandler(包含 main测试方法):
package com.xxx.qr;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
public class QRCodeEncoderHandler {
public void encoderQRCode(String content, String imgPath) {
try {
Qrcode qrcodeHandler = new Qrcode();
// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
qrcodeHandler.setQrcodeErrorCorrect('H');
qrcodeHandler.setQrcodeEncodeMode('B');
qrcodeHandler.setQrcodeVersion(5);
System.out.println(content);
// int imgSize = 67 + 12 * (size - 1);
byte[] contentBytes = content.getBytes("utf-8");
BufferedImage bufImg = new BufferedImage(115, 115,
BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bufImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, 115, 115);
// 设定图像颜色> BLACK
gs.setColor(Color.BLACK);
// 设置偏移量 不设置可能导致解析出错
int pixoff = 2;
// 输出内容> 二维码
if (contentBytes.length > 0 && contentBytes.length < 800) {
boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
for (int i = 0; i < codeOut.length; i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[j][i]) {
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
}
}
}
} else {
System.err.println("QRCode content bytes length = "
+ contentBytes.length + " not in [ 0,120 ]. ");
}
gs.dispose();
bufImg.flush();
File imgFile = new File(imgPath);
if (!imgFile.exists()) {
OutputStream out = new FileOutputStream(imgFile);
out.flush();
out.close();
}
// 生成二维码QRCode图片
ImageIO.write(bufImg, "png", imgFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args the command line arguments
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//生成二维码
//取当前时间为图片名称 带毫秒的
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS" );
Date d=new Date();
String str=sdf.format(d);
String imgPath = "D:/"+str+".png";
String content= "这是一个测试";
QRCodeEncoderHandler handler = new QRCodeEncoderHandler();
handler.encoderQRCode(content, imgPath);
System.out.println("imgPath:"+imgPath);
System.out.println("encoder QRcode success");
//解除二维码
// File file = new File("D:/20170717145558602.png");
// BufferedImage bufferedImage = ImageIO.read(file);
// QRCodeDecoder codeDecoder = new QRCodeDecoder();
// String result = new String(codeDecoder.decode(new com.xxx.qr.QRCodeImage(bufferedImage)),"utf-8");
// System.out.println(result);
}
}
第二个类QRCodeImage:
package com.xxx.qr;
import java.awt.image.BufferedImage;
public class QRCodeImage implements jp.sourceforge.qrcode.data.QRCodeImage {
BufferedImage bufferedImage;
public QRCodeImage(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();
}
}