2022-06-25 16:41

利用QRCode生成二维码和解析二维码

码自答

其它

(714)

(0)

收藏

二维码-二维条码,用某种特定的几何图形,按照一定规律在平面分布,用来记录数据符号信息的图形。

利用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"));

}

执行结果如下:

image.png


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);
}

执行结果如下:

image.png

0条评论

点击登录参与评论