二维码-二维条码,用某种特定的几何图形,按照一定规律在平面分布,用来记录数据符号信息的图形。
利用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条评论
点击登录参与评论