Java Spring boot实现生成二维码

目录
  • 一、引入springboot依赖:
  • 二、工具类代码:
  • 三、调用工具类生成二维码
    • 1、将链接生成二维码图片并保存到指定路径
    • 2、将链接生成二维码直接显示在页面
    • 3、将以get请求传参链接生成二维码
  • 总结

一、引入spring boot依赖:

   <!--引入生成二维码的依赖-->
   <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>core</artifactId>
       <version>3.3.0</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>javase</artifactId>
       <version>3.3.0</version>
   </dependency>

二、工具类代码:

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;

/**
 * 二维码生成工具类
 */
public class QrCodeUtils {
    private static final String CHARSET = "utf-8";
    public static final String FORMAT = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 300;
    // LOGO宽度
    private static final int LOGO_WIDTH = 60;
    // LOGO高度
    private static final int LOGO_HEIGHT = 60;

    /**
     * 生成二维码
     *
     * @param content      二维码内容
     * @param logoPath     logo地址
     * @param needCompress 是否压缩logo
     * @return 图片
     * @throws Exception
     */
    public static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception {
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
                hints);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        if (logoPath == null || "".equals(logoPath)) {
            return image;
        }
        // 插入图片
        QrCodeUtils.insertImage(image, logoPath, needCompress);
        return image;
    }

    /**
     * 插入LOGO
     *
     * @param source       二维码图片
     * @param logoPath     LOGO图片地址
     * @param needCompress 是否压缩
     * @throws IOException
     */
    private static void insertImage(BufferedImage source, String logoPath,
                                    boolean needCompress) throws Exception {
        File file = new File(logoPath);
        if (!file.exists()) {
            System.err.println(""+logoPath+"   该文件不存在!");
            return;
        }
        Image src = ImageIO.read(new File(logoPath));
        int width = src.getWidth(null);
        int height = src.getHeight(null);
        if (needCompress) { // 压缩LOGO
            if (width > LOGO_WIDTH) {
                width = LOGO_WIDTH;
            }
            if (height > LOGO_HEIGHT) {
                height = LOGO_HEIGHT;
            }
            Image image = src.getScaledInstance(width, height,
                    Image.SCALE_SMOOTH);
            BufferedImage tag = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            src = image;
        }
        // 插入LOGO
        Graphics2D graph = source.createGraphics();
        int x = (QRCODE_SIZE - width) / 2;
        int y = (QRCODE_SIZE - height) / 2;
        graph.drawImage(src, x, y, width, height, null);
        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
        graph.setStroke(new BasicStroke(3f));
        graph.draw(shape);
        graph.dispose();
    }

    /**
     * 生成二维码(指定路径保存)
     *
     * @param content 内容
     * @param imgPath logo图片地址(内嵌图片)
     * @param destPath 生成二维码存放地址
     * @param needCompress 是否压缩logo
     * @throws Exception
     */
    public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
        BufferedImage image = QrCodeUtils.createImage(content, imgPath, needCompress);
        mkdirs(destPath);
        // String file = new Random().nextInt(99999999)+".jpg";
        // ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
        ImageIO.write(image, FORMAT, new File(destPath));
    }

    /**
     * 生成二维码(直接将二维码以图片输出流返回)
     *
     * @param content 内容
     * @param imgPath logo图片地址(内嵌图片)
     * @param needCompress 是否压缩logo
     * @return
     * @throws Exception
     */
    public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
        BufferedImage image = QrCodeUtils.createImage(content, imgPath, needCompress);
        return image;
    }

    public static void mkdirs(String destPath) {
        File file = new File(destPath);
        // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
    }

    /**
     * 生成二维码(内嵌LOGO)
     *
     * @param content      内容
     * @param logoPath     LOGO地址
     * @param output       输出流
     * @param needCompress 是否压缩LOGO
     * @throws Exception
     */
    public static void encode(String content, String logoPath, OutputStream output, boolean needCompress)
            throws Exception {
        BufferedImage image = QrCodeUtils.createImage(content, logoPath, needCompress);
        ImageIO.write(image, FORMAT, output);
    }

    /**
     * 获取指定文件的输入流,获取logo
     *
     * @param logoPath 文件的路径
     * @return
     */
    public static InputStream getResourceAsStream(String logoPath) {
        return QrCodeUtils.class.getResourceAsStream(logoPath);
    }

    /**
     * 解析二维码
     *
     * @param file
     *            二维码图片
     * @return
     * @throws Exception
     */
    public static String decode(File file) throws Exception {
        BufferedImage image;
        image = ImageIO.read(file);
        if (image == null) {
            return null;
        }
        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        Result result;
        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
        result = new MultiFormatReader().decode(bitmap, hints);
        String resultStr = result.getText();
        return resultStr;
    }

    /**
     * 解析二维码
     *
     * @param path
     *            二维码图片地址
     * @return
     * @throws Exception
     */
    public static String decode(String path) throws Exception {
        return QrCodeUtils.decode(new File(path));
    }

	//测试一:
    public static void main(String[] args) throws Exception {
        String text = "https://blog.csdn.net/weixin_43763430";
        String logoPath = "D:\\qrCode\\logo.jpg";
        String destPath = "D:\\qrCode\\csdn.jpg";
        QrCodeUtils.encode(text,logoPath,destPath,true);
    }
}

三、调用工具类生成二维码

1、将链接生成二维码图片并保存到指定路径

工具类中的主方法是指定了二维码链接的内容是博客地址,并保存在D:\qrCode\csdn.jpg,二维码嵌套了头像的图片,期望实现的是生成二维码后被扫码直接进入到博客也没。如若不嵌入头像,直接将logoPath参数设为null。

	//测试一:
    public static void main(String[] args) throws Exception {
        String text = "https://blog.csdn.net/weixin_43763430";
        String logoPath = "D:\\qrCode\\logo.jpg";
        String destPath = "D:\\qrCode\\csdn.jpg";
        QrCodeUtils.encode(text,logoPath,destPath,true);
    }

运行该主方法后,可在指定路径中看到生成的二维码图片。

2、将链接生成二维码直接显示在页面

运用spring boot生成二维码无需将保存二维码的图片,只须前端调用springboot接口即可在页面上显示二维码。实现了实时生成二维码。Controller层接口代码示例如下:

	@GetMapping("/anon/coupon/qrCodeTest")
    @ApiOperation(value = "获取二维码")
    public void qrCodeTest(HttpServletResponse response) throws Exception {
        String text = "https://blog.csdn.net/weixin_43763430";
        String logoPath = "D:\\qrCode\\logo.jpg";
        //String destPath = "D:\\qrCode\\csdn.jpg";
        QrCodeUtils.encode(text,logoPath,response.getOutputStream(),true);
    }

打开浏览器访问该接口地址,页面就会显示生成的二维码。扫描二维码即可进入到博客页面。

3、将以get请求传参链接生成二维码

二维码运用到各种业务中,通常需要根据不同用户识别其相对应的内容,如以上示例是访问的博客主页面,如若想根据访问者传递的参数访问博客中特定的文章,文章访问各篇文章是用的get请求方式,即可根据传参实现get请求传入不同参数生成二维码的内容不同。

	@GetMapping("/anon/coupon/qrCodeTest")
    @ApiOperation(value = "获取二维码")
    public void qrCodeTest(@RequestParam(value = "id") String id,HttpServletResponse response) throws Exception {
        String text = "https://blog.csdn.net/weixin_43763430/article/details/" + id;
        String logoPath = "D:\\qrCode\\logo.jpg";
        //String destPath = "D:\\qrCode\\csdn.jpg";
        QrCodeUtils.encode(text,logoPath,response.getOutputStream(),true);
    }

用浏览器访问该接口地址,页面生成二维码,用手机扫描二维码即可跳转到博客中该篇文章页面。

总结

到此这篇关于Java Spring boot实现生成二维码的文章就介绍到这了,更多相关Java Spring boot生成二维码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java使用jar包生成二维码的示例代码

    使用java进行二维码的生成与读取使用到了谷歌的zxing.jar 第一步 导入,maven依赖或者下载指定jar包 <!-- https://mvnrepository.com/artifact/com.google.zxing/javase --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version

  • java创建二维码并赋予url链接的功能实现

    首先在pom文件中导入有关依赖 <dependency>     <groupId>com.google.zxing</groupId>     <artifactId>core</artifactId>     <version>3.3.0</version> </dependency>   <dependency>     <groupId>com.google.zxing</

  • Java生成读取条形码和二维码的简单示例

    条形码 将宽度不等的多个黑条和白条,按照一定的编码规则排序,用以表达一组信息的图像标识符 通常代表一串数字 / 字母,每一位有特殊含义 一般数据容量30个数字 / 字母 二维码 用某种特定几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息 比一维条形码能存储更多信息,表示更多数据类型 能够存储数字 / 字母 / 汉字 / 图片等信息 可存储几百到几十KB字符 Zxing Zxing主要是Google出品的,用于识别一维码和二维码的第三方库 主要类: BitMatrix位图

  • Java使用opencv识别二维码的完整步骤

    目录 前言 OpenCV的安装 开发环境配置 识别二维码 总结 前言 OpenCV的全称是Open Source Computer Vision Library,它是一个跨平台的计算机视觉库,由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用.OpenCV本身由C++语言开发,但也具有各种其他语言的接口,并支持windows.linux.ios.android等各种操作系统.本文将介绍如何使用OpenCV与Java语言进行二维码识别. OpenCV的安装 目前Op

  • Java实现获取小程序带参二维码并保存到本地

    目录 获取小程序带参二维码并保存到本地 业务场景 POSTMAN调试 WxUtil封装:下载带参数的小程序二维码 Controller调用 下载验证 微信小程序码的生成及保存到阿里云oss 阿里云oss工具类 获取小程序带参二维码并保存到本地 业务场景 下载并保存带参数的小程序二维码,用户直接扫描带参二维码就进入小程序,自动根据参数完成部分业务.这个时候就需要用到微信小程序提供的二维码接口 wxacode.getUnlimited ,官方文档地址 网上介绍的很多方法有些过时了,有些不科学,调用起

  • Java 生成带Logo和文字的二维码

    ZXing 是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing 可以实现使用手机的内置的摄像头完成条形码的扫描及解码.本章讲解用 ZXing 生成和扫码二维码. 依赖 在Java项目中pom.xml加入: <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version&g

  • Java番外杂谈之每天扫的二维码你了解它内含的信息吗

    ️二维码发展简史️ 条形码的诞生 在理解二维码技术原理之前,我们先来简单看下它是怎么发展起来的.早在1948年,伯纳德·塞尔沃还是费城煤气科技学院的一名研究生,在一次偶然的机会他得知当地的一家超市的老板想要院长帮忙设计一种可以扫描商品价格的装置,用以提高超市内货品销售的效率.因为超市里的收银员在结算货品的时候每次都需要手动输入架构,超时客流量达的时候,收银员结算效率十分低下.但是院长觉得这是一件非常不容易做到的事情. 然而伯纳德·塞尔沃与他的朋友约瑟夫·伍德兰德却觉得这是一个巨大的商机,决定要好

  • Java如何生成带网站链接(URL)的二维码

    QR 码 QR 码最常见的应用便是为网站中一个特定的网页或下载页带来流量.因此,QR码常常会编码URL或网站地址,用户可以通过手机摄像头扫描,并在其浏览器中打开.URL可以直接编码在QR码中. QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快. 它可以存储多用类型 如上图时一个qrcode的基本结构,其中: 位置探测图形.位置探测图形分隔符.定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异; 校正图形:规格确定,校正图形

  • 用Java生成二维码并附带文字信息

    一.引入依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId&

  • Java Spring boot实现生成二维码

    目录 一.引入springboot依赖: 二.工具类代码: 三.调用工具类生成二维码 1.将链接生成二维码图片并保存到指定路径 2.将链接生成二维码直接显示在页面 3.将以get请求传参链接生成二维码 总结 一.引入spring boot依赖: <!--引入生成二维码的依赖--> <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>co

  • Java使用Google Zxing生成二维码的例子

    以前只用过jQuery.qrcode生成过二维码,这次使用的是Google的zxing通过Java代码生成二维码并以流的方式输出到前台页面 所需jar包:zxing-3.2.1.jar 代码 前台展示页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); S

  • 利用java生成二维码工具类示例代码

    二维码介绍 二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理. 如下为java生成二维码工具类,可以选择生成文件,或者直接在页面生成,话不多说了,来一起看看详细的示例代码吧. 示例代码 import java.aw

  • java ZXing生成二维码及条码实例分享

    1.jar包:   ZXing-core-3.3.0.jar http://mvnrepository.com/artifact/com.google.zxing/core   ZXing-javase-3.3.0.jar   http://mvnrepository.com/artifact/com.google.zxing/javase BufferedImageLuminanceSource.java package com.webos.util; import java.awt.Grap

  • Java利用Zxing生成二维码的简单实例

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法,现在我简单介绍一下使用Java利用Zxing生成与解析二维码 1.二维码的生成 1.1 将Zxing-core.jar 包加入到classpath下. 1.2 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用. import com.google.zxing.common.BitMatrix; i

  • 用JAVA 设计生成二维码详细教程

    教你一步一步用 java 设计生成二维码 在物联网的时代,二维码是个很重要的东西了,现在无论什么东西都要搞个二维码标志,唯恐落伍,就差人没有用二维码识别了.也许有一天生分证或者户口本都会用二维码识别了.今天心血来潮,看见别人都为自己的博客添加了二维码,我也想搞一个测试一下. 主要用来实现两点: 1. 生成任意文字的二维码. 2. 在二维码的中间加入图像. 一.准备工作. 准备QR二维码3.0 版本的core包和一张jpg图片. 下载QR二维码包. 首先得下载 zxing.jar 包, 我这里用的

  • Java生成二维码可添加logo和文字功能

    废话不多说,直接给大家贴代码了,具体代码如下所示: package com.luo.wctweb.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Date; imp

  • java中使用zxing批量生成二维码立牌

    使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址.文本等)生成二维码并放在该位置,最后加上立牌编号. 步骤: 1).做好背景图,如下图: 2).生成二维码BufferedImage对象.代码如下: /** * * @Title: toBufferedImage * @Description: 把文本转化成二维码图片对象 * @param text * 二维码内容 * @param width * 二维码高度 * @param height * 二位宽度 * @para

  • Java 生成二维码的工具资料整理

    1.  使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着  http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 有朋友问我要这个图片生成的代码,我就在网上搜索然后整理了一个类,首先要把SwetakeQRCode的jar包qrcode.jar放在工程的编译路

随机推荐