阅读 158

Java通过QRCode生成二维码

Java通过QRCode生成二维码

一、前言

QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。


先下载QRCode.jar包:https://pan.baidu.com/s/1Pb9XzWKhumgwaYrE90vyWg


二、代码实例

1、生成二维码

//加密:文字信息 -> 二维码

public static void encoderQRCode(String content, String imgPath, String imgType, int size) throws Exception{

    //RenderedImage是一个接口,因此要找到它的实现类 BufferedImage

    //RenderedImage bufferedImage = null;

    //代表内存中的一张图片

    BufferedImage bufferedImage = generateQRCodeCommon(content, imgType, size);

    //设置图片格式,与输出的路径

    ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));

}

 

//产生一个二维码的BufferedImage

private static BufferedImage generateQRCodeCommon(String content, String imgType, int size) throws Exception{

    //QRCode对象:字符串转为boolean[][]

    Qrcode qrcode = new Qrcode();

    //设置二维码的排错率

    /**

     * 纠错等级分为

     * level L : 最大 7% 的错误能够被纠正;

     * level M : 最大 15% 的错误能够被纠正;

     * level Q : 最大 25% 的错误能够被纠正;

     * level H : 最大 30% 的错误能够被纠正;

     */

    qrcode.setQrcodeErrorCorrect('M');

    qrcode.setQrcodeEncodeMode('B');//注意版本信息 N代表数字 、A代表 a-z,A-Z、B代表 其他)

    qrcode.setQrcodeVersion(size);//尺寸  1-40

 

    boolean[][] codeOuts = qrcode.calQrcode(content.getBytes("gbk"));

 

    int imgSize = 67 + 12 * (size - 1);

 

    BufferedImage bufferedImage = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);

    //生成一个画板

    Graphics2D graphics = bufferedImage.createGraphics();

    graphics.setBackground(Color.WHITE);//将画板的背景色设置为白色

    graphics.clearRect(0, 0, imgSize, imgSize);//初始化

    graphics.setColor(Color.BLACK);//设置画板上图像的颜色

 

    int pixoff = 2;

    for(int j = 0;j<codeOuts.length;j++){

        for(int i = 0;i<codeOuts.length;i++){

            if (codeOuts[j][i]) {

                graphics.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);

            }

        }

    }

    //增加logo

    Image logo = ImageIO.read(new File("H:\\CSDN\\哪吒.jpg"));

    int maxWidth = bufferedImage.getWidth();

    int maxHeight = bufferedImage.getHeight();

    graphics.drawImage(logo, imgSize/5*2, imgSize/5*2, maxWidth/5, maxHeight/5, null);

    graphics.dispose();//释放空间

    bufferedImage.flush();//清理

    return bufferedImage;

}

注:敲代码最重要的是思路,由ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));入手,依次构建参数,因为RenderedImage是一个接口,因此要找到它的实现类 BufferedImage,


2、解析二维码

//解密

public static String decoderQRCode(String imgPath) throws IOException {

    //硬盘中图片加载入内存

    BufferedImage bufferedImage = ImageIO.read(new File(imgPath));

    //解密

    QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();

    QRCodeImage qrCodeImage = new QRCodeImageImpl(bufferedImage);

    byte[] decode = qrCodeDecoder.decode(qrCodeImage);

    return new String(decode, "gbk");

}

 


package com.guor.qrcode;

 

import jp.sourceforge.qrcode.data.QRCodeImage;

 

import java.awt.image.BufferedImage;

 

public class QRCodeImageImpl implements QRCodeImage {

    BufferedImage bufferedImage;//内存中的二维码

    public QRCodeImageImpl(BufferedImage bufferedImage){

        this.bufferedImage = bufferedImage;

    }

 

    @Override

    public int getWidth() {

        return bufferedImage.getHeight();

    }

 

    @Override

    public int getHeight() {

        return bufferedImage.getHeight();

    }

 

    //像素

    @Override

    public int getPixel(int x, int y) {

        return bufferedImage.getRGB(x, y);

    }

}

3、测试类

package com.guor.qrcode;

 

public class QrcodeTest {

    public static void main(String[] args) throws Exception {

        String content = "https://blog.csdn.net/guorui_java/article/details/112391105";//内容信息

        String path = "H:/qrcode.jpg";

        //加密:文字信息 -> 二维码

        QRCodeUtil.encoderQRCode(content, path, "png", 20);

        //解密

        String decoderQRCode = QRCodeUtil.decoderQRCode(path);

        System.out.println(decoderQRCode);

    }

}

4、生成的二维码



一扫出神奇,还真的跳转到了我的Java知识体系总结(2021版)博客


解析的文字:




三、遇到的问题

开始的时候,在解密的时候,出现了一个bug,




上网一搜,发现是因为中间插入的logo,设置的大小太大了,缩小一点,就好了。

————————————————

版权声明:本文为CSDN博主「素小暖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/guorui_java/article/details/114709179


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐