java 二维码生成(可带图片)springboot版

Posted luojiesheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;




如果觉得好,请给个赞或好评,尊重写文辛苦,不轻易转载~~~多谢!

以上是关于java 二维码生成(可带图片)springboot版的主要内容,如果未能解决你的问题,请参考以下文章

vue:生成二维码 qrcodevue-qr(二维码中间可带logo)

微信小程序php生成小程序(传参)二维码图片

java工具类生成二维码

JAVA根据URL生成二维码图片

JAVA根据URL生成二维码图片

java生成带圆形logo的二维码图片,且支持背景图片