作者 | 带妳心菲

来源 | urlify.cn/emE3ya

我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现,hutool其实也是对于zxing的一个封装,但是封装前后,确实比较简单了。

Zxing原生方式

添加依赖

    com.google.zxing    core    3.3.3    com.google.zxing    javase    3.3.3

二维码生成工具类

下面是把生成二维码的方法,封装到了QRCodeUtil的类之中,这个方法看起来还是比较多的,但是也谈不上太复杂,主要是对于BufferedImage生成图片,然后就是ImageIO.write()方法,write的位置,可以是普通的磁盘文件,也可以是web的流,我们使用web流的时候,就需要添加com.google.zxing-javase的依赖。

@Component@Slf4jpublic class QRCodeUtil {    /**     * CODE_WIDTH:二维码宽度,单位像素     * CODE_HEIGHT:二维码高度,单位像素     * FRONT_COLOR:二维码前景色,0x000000 表示黑色     * BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色     * 演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白     */    private static final int CODE_WIDTH = 400;    private static final int CODE_HEIGHT = 400;    private static final int FRONT_COLOR = 0x000000;    private static final int BACKGROUND_COLOR = 0xFFFFFF;    /**     * @param codeContent        二维码参数内容,如果是一个网页地址,如 https://www.baidu.com/ 则 微信扫一扫会直接进入此地址, 如果是一些参数,如     *                           1541656080837,则微信扫一扫会直接回显这些参数值     * @param codeImgFileSaveDir 二维码图片保存的目录,如 D:/codes     * @param fileName           二维码图片文件名称,带格式,如 123.png     */    public static void createCodeToFile(String codeContent, File codeImgFileSaveDir, String fileName) {        try {            if (codeContent == null || "".equals(codeContent)) {                log.info("二维码内容为空,不进行操作...");                return;            }            codeContent = codeContent.trim();            if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) {                codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();                log.info("二维码图片存在目录为空,默认放在桌面...");            }            if (!codeImgFileSaveDir.exists()) {                codeImgFileSaveDir.mkdirs();                log.info("二维码图片存在目录不存在,开始创建...");            }            if (fileName == null || "".equals(fileName)) {                fileName = new Date().getTime() + ".png";                log.info("二维码图片文件名为空,随机生成 png 格式图片...");            }            BufferedImage bufferedImage = getBufferedImage(codeContent);            /*             * javax.imageio.ImageIO:java扩展的图像IO             * write(RenderedImage im, String formatName, File output)             *       im:待写入的图像, formatName:图像写入的格式,output:写入的图像文件,文件不存在时会自动创建             */            File codeImgFile = new File(codeImgFileSaveDir, fileName);            ImageIO.write(bufferedImage, "png", codeImgFile);            log.info("二维码图片生成成功:" + codeImgFile.getPath());        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 生成二维码并输出到输出流, 通常用于输出到网页上进行显示     * 输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write     * write(RenderedImage im,String formatName,File output):写到文件中     * write(RenderedImage im,String formatName,OutputStream output):输出到输出流中     *     * @param codeContent  :二维码内容     * @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream     */    public static void createCodeToOutputStream(String codeContent, OutputStream outputStream) {        try {            if (codeContent == null || "".equals(codeContent.trim())) {                log.info("二维码内容为空,不进行操作...");                return;            }            codeContent = codeContent.trim();            BufferedImage bufferedImage = getBufferedImage(codeContent);            /*             * 区别就是以一句,输出到输出流中,如果第三个参数是 File,则输出到文件中             */            ImageIO.write(bufferedImage, "png", outputStream);            log.info("二维码图片生成到输出流成功...");        } catch (Exception e) {            e.printStackTrace();            log.error("发生错误: {}!", e.getMessage());        }    }    private static BufferedImage getBufferedImage(String codeContent) throws WriterException {        /*         * com.google.zxing.EncodeHintType:编码提示类型,枚举类型         * EncodeHintType.CHARACTER_SET:设置字符编码类型         * EncodeHintType.ERROR_CORRECTION:设置误差校正         * ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction         *   不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的         * EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近         */        Map hints = new HashMap();        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);        hints.put(EncodeHintType.MARGIN, 1);        /*         * MultiFormatWriter:多格式写入,这是一个工厂类,里面重载了两个 encode 方法,用于写入条形码或二维码         *      encode(String contents,BarcodeFormat format,int width, int height,Map hints)         *      contents:条形码/二维码内容         *      format:编码类型,如 条形码,二维码 等         *      width:码的宽度         *      height:码的高度         *      hints:码内容的编码类型         * BarcodeFormat:枚举该程序包已知的条形码格式,即创建何种码,如 1 维的条形码,2 维的二维码 等         * BitMatrix:位(比特)矩阵或叫2D矩阵,也就是需要的二维码         */        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();        BitMatrix bitMatrix = multiFormatWriter.encode(codeContent, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);        /*         * java.awt.image.BufferedImage:具有图像数据的可访问缓冲图像,实现了 RenderedImage 接口         * BitMatrix 的 get(int x, int y) 获取比特矩阵内容,指定位置有值,则返回true,将其设置为前景色,否则设置为背景色         * BufferedImage 的 setRGB(int x, int y, int rgb) 方法设置图像像素         *      x:像素位置的横坐标,即列         *      y:像素位置的纵坐标,即行         *      rgb:像素的值,采用 16 进制,如 0xFFFFFF 白色         */        BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);        for (int x = 0; x 

添加Controller

public class QRCodeController {    @GetMapping("qrCode")    public void getQRCode(String codeContent, HttpServletResponse response) {        System.out.println("codeContent=" + codeContent);        try {            /*             * 调用工具类生成二维码并输出到输出流中             */            QRCodeUtil.createCodeToOutputStream(codeContent, response.getOutputStream());            log.info("成功生成二维码!");        } catch (IOException e) {            log.error("发生错误, 错误信息是:{}!", e.getMessage());        }    }}

添加测试页面

html>                    二维码生成器                                                生成二维码                
                    

    

Hutool的方式

Hutool的是非强制依赖性,因此zxing需要用户自行引入,我们需要加入依赖。使用hutool的时候,com.google.zxing-javase的依赖可以不需要。

添加依赖

    cn.hutool    hutool-all    5.3.10    com.google.zxing    core    3.3.3

创建QRCodeService

QRCodeService其实就是对QrCodeUtil的功能的封装,QrCodeUtil此处的类是hutool工具提供的,和我们在上面与自己与自己提供的QRCodeUtil类,不是同一个,这个需要注意一下。QrCodeUtil的功能此处主要使用到了的是生成二维码,到文件或者流之中,QrConfig是Hutool工具QrCodeUtil的配置类。

@Service@Slf4jpublic class QRCodeService {    // 自定义参数,这部分是Hutool工具封装的    private static QrConfig initQrConfig() {        QrConfig config = new QrConfig(300, 300);        // 设置边距,既二维码和背景之间的边距        config.setMargin(3);        // 设置前景色,既二维码颜色(青色)        config.setForeColor(Color.CYAN.getRGB());        // 设置背景色(灰色)        config.setBackColor(Color.GRAY.getRGB());        return config;    }    /**     * 生成到文件     *     * @param content     * @param filepath     */    public void createQRCode2File(String content, String filepath) {        try {            QrCodeUtil.generate(content, initQrConfig(), FileUtil.file(filepath));            log.info("生成二维码成功, 位置在:{}!", filepath);        } catch (QrCodeException e) {            log.error("发生错误! {}!", e.getMessage());        }    }    /**     * 生成到流     *     * @param content     * @param response     */    public void createQRCode2Stream(String content, HttpServletResponse response) {        try {            QrCodeUtil.generate(content, initQrConfig(), "png", response.getOutputStream());            log.info("生成二维码成功!");        } catch (QrCodeException | IOException e) {            log.error("发生错误! {}!", e.getMessage());        }    }}

添加Controller

@RestController@Slf4jpublic class QRCodeController {    @Autowired    private QRCodeService qrCodeService;    @GetMapping("qrCode")    public void getQRCode(String codeContent, HttpServletResponse response) {        try {            qrCodeService.createQRCode2Stream(codeContent, response);            log.info("成功生成二维码!");        } catch (Exception e) {            log.error("发生错误, 错误信息是:{}!", e.getMessage());        }    }}

效果测试

我们使用的页面和上述相同,所以,页面的情况是一样的,效果展示如下:

总结

综合来说,还是使用hutool的这种方式吧,更加方便简洁。源代码在本人springboot2.x-integration项目之中,qrcode分支是二维码生成的整合分支,欢迎fork和star。

参考

https://blog.csdn.net/xm526489770/article/details/83651555, https://www.cnblogs.com/haha12/p/11457716.html, https://blog.csdn.net/wangmx1993328/article/details/83856391, https://blog.csdn.net/qq_39313596/article/details/103564238, https://www.cnblogs.com/qingmuchuanqi48/p/12079417.html, https://www.bookstack.cn/read/hutool/18a69dd68fd334c8.md

java 生成条形码_Springboot生成二维码,怎么搞?相关推荐

  1. vue中生成条形码(jsbarcode)、二维码(qrcodejs2)

    1.条形码插件jsbarcode 安装:npm install jsbarcode --save 引入:在需要生成条形码的页面引入即可 import JsBarcode from 'jsbarcode ...

  2. JAVA实现基于ZXing的二维码自动生成与图片合成

    JAVA实现基于ZXing的二维码自动生成与图片合成 近日做项目需要生成带有信息的二维码,并嵌入到一张图片中.实现思路采用Zxing生成二维码,java图形库进行图片的嵌入. 生成二维码 ZXing是 ...

  3. java实现生成SVG格式的二维码

    这2天跟图片杠上了,项目经理要求上传到腾讯云上的二维码既要有img格式的,又要要svg格式,谷歌了半天在网上找了个swt做的maven项目,可以生成各种格式的二维码,奈何代码全程没注解,好在方法名起的 ...

  4. java利用core 工具实现二维码的生成与解析

    java利用core 工具实现二维码的生成与解析 简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反, ...

  5. Java生成中间logo的二维码(还可以加上二维码名称哦)

    最近有负责微信开发,对于微信开发的项目,肯定少不了二维码啦,正好有个这样的需求,这对不同的商品生成一个二维码,扫码即刻下单.博主就弄了一个二维码生成的工具类. 弄出来之后,产品经理又说了,中间放上公司 ...

  6. Java生成微信小程序二维码

    Java生成微信小程序二维码 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Byt ...

  7. java实现电脑截屏+生成解析简单的二维码

    前言 这个是在逛csdn上面看见其他人的,有点兴趣,故于此记录,同时分享给大家.至于其他人的博客我也没有记一下网站,罪过罪过....本来现在也没有这样的需求,但是感觉有点意思,所以记了下来. java ...

  8. Java生成微信小程序二维码,5种实现方式,一个比一个简单

    文章目录 前言 先看官网 一.JDK自带的URLConnection方式 二.Apache的HttpClient方式 三.okhttp3方式 四.Unirest方式 五.RestTemplate方式 ...

  9. 【java】Java生成微信小程序二维码

    文章目录 前言 应用场景 微信小程序官网 1.RestTemplate方式 核心代码 getAccessToken 2. Unirest方式 Maven依赖 核心代码 3. okhttp3方式 Mav ...

  10. zxing生成带logo的二维码

    倒Zxing依赖 implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1' 代码段 import android.graphics.Bitma ...

最新文章

  1. Idea用maven给springboot打jar包
  2. 【C语言刷题】交换两个变量(包含不创建临时变量)的解法
  3. 云闪付怎么设置不跳华为支付_【教程】华为Pay用闪付券撸京东E卡!
  4. 《java语法实例2~15章》
  5. 怎么样给单选按钮前面插入小图标
  6. 香帅的北大金融学课笔记17 -- 公司治理
  7. vba vbscript.regexp加载dll错误_[原]排错实战——拯救加载调试符号失败的IDA
  8. 用python设计数独的心得体会_python实现数独算法实例
  9. 面试题:请介绍⼀下 JMM(Java 内存模型)
  10. postgresql 计算时间差的秒数、天数
  11. flask get和post
  12. 水很深的深度学习-Task01深度学习概述与数学基础
  13. ResultSet用法集锦
  14. docker菜鸟入门
  15. 常见音频格式大盘点分析
  16. 你是怎样毁掉自己的?
  17. AI芯片:寒武纪NPU设计分析(DianNao)
  18. 打工人最怕听到的词是团建
  19. python爬取高德地图_爬虫实战:如何爬取高德地图?
  20. mysql5.7安装审计日志插件audit-plugin

热门文章

  1. 唐僧给李世民的取经汇报
  2. 深入理解Oracle Exadata
  3. Ubuntu 11.10 系统启动默认进入终端
  4. 标志寄存器02 - 零基础入门学习汇编语言55
  5. WinCE-多功能控件之无闪烁时间显示
  6. 3.微服务:从设计到部署 --- 进程间通信
  7. 9.卷2(进程间通信)---记录上锁
  8. 6.Composer实现PHP中类的自动加载
  9. 11.策略模式(Strategy Pattern)
  10. 用Python解析XMind