Java生成二维码
通过RQCode生成二维码
步骤:
1、jar包 下载qrcode.jar https://files.cnblogs.com/files/bigroc/QRCode.zip 在项目路径下新建libs 把jar包粘贴进去 添加到类路径
2、编码
a、生成一个QRCode帮助类 QRCodeUtil.java
package qrcode; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class QRCodeUtil { /** * content :文字信息 * imgType :文件格式 * imgPath:文件路径 */ //加密:文字信息->二维码 public void encoderQRCode(String content,String imgPath,String imgType,int size) throws Exception{ //RenderedImage //内存中的图片 BufferedImage buf = qRCodeCommon(content,imgPath,size); File file =new File(imgPath); //API 生成图片 ImageIO.write(buf,imgType,file); } //产生一个二维码的bufferedImage /** * content :文字信息 * imgType :文件格式 * imgPath:文件路径 */ public BufferedImage qRCodeCommon(String content,String imgType,int size)throws Exception{ BufferedImage bufferedImage = null; //Qrcode对象 字符串->boolean[][] Qrcode qrcodeHandler = new Qrcode(); //设置二维码的排错率 7% L<M<Q<H 30% 排错率越高 可存储的信息越少 但是对二维码清晰度要求越少 qrcodeHandler.setQrcodeErrorCorrect('M'); //可存储的信息类型 N:数字 A:数字+A-Z B:所有 qrcodeHandler.setQrcodeEncodeMode('B'); //二维码的取值范围 1-40 qrcodeHandler.setQrcodeVersion(size); byte[] contentBytes = content.getBytes("utf-8"); // "邢伟" ----> byte[]"邢伟" // --->boolean[][] boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); int imgSize = 67 +12*(size-1); //长 宽 颜色 bufferedImage = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB); //RGB //创建一个画板 Graphics2D graphics2D = bufferedImage.createGraphics(); //将画板的背景设为白色 graphics2D.setBackground(Color.white); //初始化 graphics2D.clearRect(0,0,imgSize,imgSize); //设置画板上 图像的颜色 graphics2D.setColor(Color.black); //偏移量 int pixOff = 2 ; for(int j =0;j<codeOut.length;j++){ for (int i =0; i<codeOut.length;i++){ if(codeOut[j][i]){ graphics2D.fillRect(j*3+pixOff,i*3+pixOff,3,3); } } } //增加logo 将硬盘中的图片加载为Image对象 Image logo = ImageIO.read(new File("src/logo.png")) ; int maxHeight = bufferedImage.getHeight(); int maxWidth = bufferedImage.getWidth(); //在以生产的二维码上 化logo graphics2D.drawImage(logo,imgSize/5*2,imgSize/5*2,maxWidth/5,maxHeight/5,null); //释放 graphics2D.dispose(); //刷新 bufferedImage.flush(); return bufferedImage; } // 解密:二维码(图片)->文字信息 public String decodeQRCode(String imgPath) throws Exception{ //BufferedImage 内存中一张图片 硬盘里的imgPath图片 ->内存中的 BufferedImage BufferedImage bufImg = ImageIO.read(new File(imgPath)); //解密方法 QRCodeDecoder decoder = new QRCodeDecoder(); //实现接口QRCodeImage TwoDimensionCodeImage twoDimensionCodeImage = new TwoDimensionCodeImage(bufImg); byte[] bs = decoder.decode(twoDimensionCodeImage);//bufImg String content = new String(bs,"utf-8"); return content ; } }
b、在进行解密时 我们需要一个 byte[] bs = decoder.decode(twoDimensionCodeImage); //bufImg
package qrcode; import jp.sourceforge.qrcode.data.QRCodeImage; import java.awt.image.BufferedImage; public class TwoDimensionCodeImage implements QRCodeImage { BufferedImage bufferedImage ; //内存中的二维码 public TwoDimensionCodeImage(BufferedImage bufferedImage){ this.bufferedImage = bufferedImage; } @Override public int getWidth() { return bufferedImage.getHeight(); } @Override public int getHeight() { return bufferedImage.getWidth(); } @Override public int getPixel(int x, int y) { return bufferedImage.getRGB(x,y); } }
c、测试
package qrcode; import jp.sourceforge.qrcode.util.QRCodeUtility; public class Test { public static void main(String[] args) throws Exception{ /** * 生成二维码 * 生成图片的路径 *文字信息 网址信息 “helloword” */ String imgPath = "src/二维码.png"; String content = "http://www.baidu.com"; //扫描二维码后自动跳转 //生成二维码 QRCodeUtil qrCodeUtil = new QRCodeUtil(); //加密:文字信息->二维码 qrCodeUtil.encoderQRCode(content,imgPath,"png",20); //解密:二维码->文字信息 String imgContent = qrCodeUtil.decodeQRCode(imgPath); System.out.println(imgContent); } }