Java 生成二维码(Base64)

2019-11-06 来源: 朝北 发布在  https://www.cnblogs.com/ChromeT/p/11806909.html

思路


现阶段遇到这样一个问题,在原有的产品上加入线下优惠券模式,用户领取优惠券以后,获取到一个唯一的ID作为领取凭证,但是在线下用扫码枪进行扫码的时候,总不能让人手动输入吧

于是乎就想出了一个办法,后端提供一个接口,前端请求发起后,将需要加入的字符生成出二维码,然后用Base64进行编码后返回,前台直接展示即可

本地写入二维码就采用字节流的方式,将二维码直接写入到磁盘即可。

Maven依赖


        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.3.0</version>
        </dependency>

这里依赖的jar包主要是Google 的zxing 进行二维码的生成

代码


        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode("622921", BarcodeFormat.QR_CODE, 600, 600);

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);

        Base64.Encoder encoder = Base64.getEncoder();

        String text = encoder.encodeToString(outputStream.toByteArray());

        System.out.println(text);

说明:需要在二维码里面展现的内容就是字符串622921

参数600*600 表示的就是生成后二维码的宽高,单位px 像素

这里我们使用的是Java自带Base64工具类进行生成的base64编码

生成后的base64如下所示

iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYAQAAAACWHaVxAAABkUlEQVR42u3czYrDIBQGUKEP5qv7YAWHtszUX8i0WWg4LgI2erZy+90Y8nkjsFgsFovFYrFYLBaLxWKxWCwWi8VisVgnWCk04/b49R5CfDye0/ESFovFYm1mlW9e0+fm+AInS1gsFou1o5X+zoTSer/tl7BYLBbrAta7VojzJSwWi8Xa3nqvPuMcYrFYLNYyVkf/HiCDzSwWi8Xa1OqD3dQ+vsiRWSwWi7WGNRppsu+TPlEWi8VirWF1fT2hbOss6SoUZrFYLNZmVpnz3scdnWmgslgsFms7K9d//oeuwyf+q+5gsVgs1qJWUyb09UN3xrBYLBZrRyuPP9bK9bTp/2GxWCzWjtaodCjLhCYaYLFYLNZ+1ri3s2JiexUbi8VisXa0buNUIBbRQBUSzLMAFovFYi1uje7iCXU0EOp1LBaLxbqANc1+A4vFYrGuZI2u4UmHsgAWi8ViLW0diH3Toe9+WSwWi7WuNbl7Lc8uaMgsFovF2tD6drBYLBaLxWKxWCwWi8VisVgsFovFYrFYn44fIpoMJJGu/X0AAAAASUVORK5CYII=

注意:这里编码后的base64字符串没有带有前端img标签解析时候的格式字符,需要在字符串前拼接:data:image/png;base64,

方可正常显示!!

检验


效果:微信扫码后结果就是:622921

本地生成方案


只需要修改部分关键代码即可实现,通过字节流的方式进行写入到磁盘,这里使用字节流直接操作的是文件对象,可以不用关闭流。

        File file = new File("H:/test/456.png");

        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream outputStream = new FileOutputStream(file);

        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);

相关文章