二维码-二维条码,用某种特定的几何图形,按照一定规律在平面分布,用来记录数据符号信息的图形。
利用QRCode.jar生成二维码和解析二维码
1 下载QRCode.jar包
2 生成二维码:
先将字符串按照一定的编码,拆解成字节数组。
通过Qrcode类的calQrcode方法,将字节数组变成一个二维布尔型数组,这个二维的布尔型数组就是一个二维码的矩阵,布尔值为true的部分,画一个黑色的填充的矩形来表示信息。
纠错级别,生成的二维码在进行解析的时候,允许二维码中间有错误,这就是为什么有的二维码中间可以插入图标。
代码如下:
//生成二维码
public void createQRCode(String data, File file)
{
Qrcode qrcode = new Qrcode();
qrcode.setQrcodeErrorCorrect('M');//纠错级别 L-->7% M-->15% Q-->25% H->30%
qrcode.setQrcodeEncodeMode('B'); //如果有英文 必须为B
qrcode.setQrcodeVersion(7); //设置版本 数字越大 码越乱
try {
byte dataByte[] = data.getBytes("GBK");
//数据data变成字节数组
BufferedImage image = new BufferedImage(140,140,BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
graphics.fillRect(0,0,140,140);//画白色矩形 image默认为黑色背景
graphics.setColor(Color.BLACK);//设置画笔颜色
if(dataByte.length>0&&dataByte.length<=122)
{
boolean[][] flag = qrcode.calQrcode(dataByte);//生成二维码矩阵
for (int i = 0; i < flag.length; i++) {
for (int j = 0; j < flag[i].length; j++) {
if(flag[j][i]){
graphics.fillRect(j*3+2,i*3+2,3,3);//画一个填充的3*3矩形
}
}
}
}
ImageIO.write(image,"jpg",file);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}调用生成二维码的方法:
public static void main(String[] args) {
QRCodeUtil qrCodeUtil = new QRCodeUtil();
qrCodeUtil.createQRCode("万码学堂做最负责人的教育",new File("d:/data/1.jpg"));
}执行结果如下:

2 解析二维码
利用ImageIO的read方法将二维码打开,利用QrCodeImageImpl类的getRGB方法获得二维码图片的每个坐标位置对应的整数,该整数就是RGB颜色和透明度的整合。再将整合的这些整数给QRCodeDecoder的decode方法解码成为字节数组,在将字节数组通过一定的编码组合成为一个字符串.
QRCodeImageImpl是实现QRCodeImage接口。
QRCodeImageImpl类代码如下:
public class QRCodeImageImpl implements QRCodeImage {
private BufferedImage image;
public QRCodeImageImpl(BufferedImage image){
this.image = image;
}
@Override
public int getWidth() {
return this.image.getWidth();
}
@Override
public int getHeight() {
return this.image.getHeight();
}
@Override
public int getPixel(int x, int y) {
return this.image.getRGB(x,y);
//取出某个坐标对应的整数 该整数是RGB数值的打包
}
}解码代码如下:
public String resolveQRCode(File file)
{
QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
try {
BufferedImage image = ImageIO.read(file);
//打开二维码
QRCodeImage qrCodeImage = new QRCodeImageImpl(image);
//根据 二维码图片 image 创建QRCodeImage对象 将二维码变成整数数组
byte[] data = qrCodeDecoder.decode(qrCodeImage);
//解析图片 成为字节数组
String dataStr = new String(data,"GBK");
//字节数组 按照GBK编码 变成字符串
return dataStr;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}调用解析二维码方法解码:
public static void main(String[] args) {
QRCodeUtil qrCodeUtil = new QRCodeUtil();
String str = qrCodeUtil.resolveQRCode(new File("d:/data/1.jpg"));
System.out.println(str);
}执行结果如下:


0条评论
点击登录参与评论