二维码

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);
    }
}
做的不好,多多指教
原文地址:https://www.cnblogs.com/xingStudy/p/12838453.html