毫无疑问,第一点也是最重要的一点引入相关 jar 包的支持。
你可以在 mvn 仓库中进行下载。
我们先来看主函数:
// 生成图片路径 src/img.png
String imgPath = "src/qr.png";
// 二维码内容: 文字信息 , 网址信息等。。
String contenx = "Hello World";
//生成二维码
QRgenter qr = new QRgenter();
qr.encoderQRcoed(contenx,imgPath,"png",7);
我们再来看自己定义的一个类: QRgenter及其里面的方法等
// 加密: 文字--》二维码
public void encoderQRcoed(String content , String imgPah , String imgType , int size) throws Exception
{
//内存中的一张图片; 内存--》硬盘
BufferedImage bufImg = QRcodeCommon(content,imgType,size);
File file = new File(imgPah);
//API,生成图片
ImageIO.write(bufImg,imgType,file);
}
生成一个二维码必要条件: 指明二维码所代表的信息,二维码的图片类型,大小,存储路径。
这里的一个 BufferedImage 就相当于在内存中画的一张图片
再来看生成 BufferedImage 的方法:QRcodeCommon
BufferedImage bufImg = null;
int imgSize = 67 + 12*(size-1); // 放大尺寸
bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB); // 确定基本颜色 rgb
Graphics2D gp = bufImg.createGraphics(); //生成一个2d画板
gp.setBackground(Color.white); //设置背景色
gp.clearRect(0,0,imgSize,imgSize); //初始化背景的大小范围,从左上角开
gp.setColor(Color.BLACK); //设置二维码颜色
二维码设置的最大尺寸为 40 但太小,又不能违反语法规则,只能进行放大。
接下来这一段代码的作用是, 将 String content 转化为bytes数组,在将字节数据转为二维的boolean数组,然后分布在画板上,当某个小方框内为true时,则被填充为黑色。
// 将内容变成矩阵形式,boolean数组,有内容则方框为黑,无则白
Qrcode qrcodeHandler = new Qrcode();
qrcodeHandler.setQrcodeErrorCorrect('M'); //设置二维码排错率 L:7%<M<Q<H:30% 排错率越高,可存储信息越少,二维码清晰度要求不高
qrcodeHandler.setQrcodeEncodeMode('B');//可存放信息类型 : N:数字 A:数字+A-Z B:所有
qrcodeHandler.setQrcodeVersion(size); //尺寸: 1-40
byte[] contentBytes = contenx.getBytes(); // 将内容生成二维数组
boolean[][]codeOut = qrcodeHandler.calQrcode(contentBytes); //在画板上标出范围的所有小方框 -->二维
int pixof = 2; //偏移量
for(int i = 0 ;i<codeOut.length;i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[i][j])
gp.fillRect(i * 3 + pixof, j * 3 + pixof, 3, 3); // 离左上角有点距离
}
}
重点代码解析:
由于是 I/O 操作,我们得释放资源等。
gp.dispose(); // 释放空间
bufImg.flush();
return bufImg;
这里的 flush 就是将管道中的数据强制冲进内存中。
到这里全部结束,接着就是运行主函数,生成对应的二维码啦~
结果参照:
不信的话,你可以检验一哈!
总结: 涉及到二维码的工具类 QRCode , 以及如何通过代码将信息加密成二维码等。