zoukankan      html  css  js  c++  java
  • java 二维码生成(可带图片)springboot版

    本文(2019年6月29日 飞快的蜗牛博客)

    有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样,是要求自己怎么样,男人更应该对自己好点,照顾好自己是最基本的,

    不然你怎么照顾别人,男人是竞争的产物不是吗?

    言归正传:

    首先加入依赖我的目前依赖是:

    <!-- 二维码生成 -->
    <dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.0</version>
    </dependency>

    第一步:

    1】写工具类,宽度,高度这里写死的,我是觉得前台可控制,你自己也可以修改自己想要的

    package com.xxff.util;

    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.OutputStream;
    import java.util.Hashtable;

    public class QRCodeUtil {

    private static final String CHARSET = "utf-8";
    private static final String FORMAT_NAME = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 300;
    // LOGO宽度
    private static final int WIDTH = 60;
    // LOGO高度
    private static final int HEIGHT = 60;

    private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
    Hashtable hints = new Hashtable();
    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 (imgPath == null || "".equals(imgPath)) {
    return image;
    }
    // 插入图片
    QRCodeUtil.insertImage(image, imgPath, needCompress);
    return image;
    }

    private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
    File file = new File(imgPath);
    if (!file.exists()) {
    System.err.println("" + imgPath + " 该文件不存在!");
    return;
    }
    Image src = ImageIO.read(new File(imgPath));
    int width = src.getWidth(null);
    int height = src.getHeight(null);
    if (needCompress) { // 压缩LOGO
    if (width > WIDTH) {
    width = WIDTH;
    }
    if (height > HEIGHT) {
    height = 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();
    }

    public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
    BufferedImage image = QRCodeUtil.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_NAME, new File(destPath));
    }

    public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
    BufferedImage image = QRCodeUtil.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();
    }
    }

    public static void encode(String content, String imgPath, String destPath) throws Exception {
    QRCodeUtil.encode(content, imgPath, destPath, false);
    }
    // 被注释的方法
    /*
    * public static void encode(String content, String destPath, boolean
    * needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath,
    * needCompress); }
    */

    public static void encode(String content, String destPath) throws Exception {
    QRCodeUtil.encode(content, null, destPath, false);
    }

    public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
    throws Exception {
    BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
    ImageIO.write(image, FORMAT_NAME, output);
    }

    public static void encode(String content, OutputStream output) throws Exception {
    QRCodeUtil.encode(content, null, output, false);
    }

    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 hints = new Hashtable();
    hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
    result = new MultiFormatReader().decode(bitmap, hints);
    String resultStr = result.getText();
    return resultStr;
    }

    public static String decode(String path) throws Exception {
    return QRCodeUtil.decode(new File(path));
    }


    }

    第二步:测试

    2】可直接微信扫描结果测试

    package com.xxff.util;

    public class QrCodeTest {


    public static void main(String[] args) throws Exception {
    // 存放在二维码中的内容
    String text = "我是小铭";
    // 嵌入二维码的图片路径
    String imgPath = "C:/Users/DELL01/Desktop/图片/宋世杰.jpg";
    // 生成的二维码的路径及名称
    String destPath = "C:/Users/DELL01/Desktop/图片/jam.jpg";
    //生成二维码
    QRCodeUtil.encode(text, imgPath, destPath, true);
    // 解析二维码
    String str = QRCodeUtil.decode(destPath);
    // 打印出解析出的内容
    System.out.println(str);

    }



    }

    第三步:controller  控制器

    3】controller  控制器

    package com.xxff.controller;


    import com.xxff.util.QRCodeUtil;
    import com.xxff.util.UUID;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import javax.servlet.http.HttpServletResponse;
    import java.io.File;

    /**
    * 二维码生成器,支持中文
    *
    */
    @RestController
    @RequestMapping("/QRcode")
    public class QRcodeController {
    /**
    * 指定存储路径,这里是你自己配置的项目磁盘路径
    */
    @Value(value="${application.profile}")
    private String profile;
    /**
    * 1.嵌入二维码的图片路径,要把嵌入二维码的图片提前放到D:/xxffprofile/qrcode/该路径下,
    * 并起名称为qrcode.jpg
    * 2.如果图片名称为空,那么就会生成一个纯净的二维码
    */
    String imgPath = "qrcode.jpg";
    // 生成的二维码的路径
    String destPath = profile+"qrcode/";

    @RequestMapping("/createQRcode")
    public String createQRcode(HttpServletResponse response,String contents) throws Exception{
    //嵌入图片
    File testFile = new File(destPath+imgPath);
    //目标文件夹
    File filebag = new File(destPath);
    //文件夹是否存在,不存在就创建
    if (!filebag.exists()) {
    filebag.mkdirs();
    }
    String qrImgPath = "";
    //二维码嵌入图片是否存在,不存在就生成纯净的二维码图片
    if(testFile.exists()){
    qrImgPath = destPath+imgPath;
    }
    String newName = UUID.getUUID()+".jpg";
    destPath += newName;
    //生成二维码
    QRCodeUtil.encode(contents, qrImgPath, destPath, true);
    String rpath = "qrcode/"+newName;
    return rpath;

    }
    }

    如果觉得好,请给个赞或好评,尊重写文辛苦,不轻易转载~~~多谢!
  • 相关阅读:
    SSM商城项目(二)
    SSM商城项目(一)
    Solr
    Lucene
    TP5分页函数paginate中的each()传参
    微信小程序+php 授权登陆,完整代码
    thinkphp5 + barcode 生成条形码
    微信小程序-获取当前位置和城市名
    PHP查询附近的人及其距离的实现方法
    thinkphp5连接sql server
  • 原文地址:https://www.cnblogs.com/luojiesheng/p/11106107.html
Copyright © 2011-2022 走看看