主要是集合hutool工具的使用,简单方便。
获取二维码
/**
* 根据内容 获取二维码
* @param content 内容
* @return
*/
@Override
public BufferedImage getQrCode(String content,int width, int height) {
//二维码设置
QrConfig config = QrCodeUtils.getConfig(width, height);
//生成指定url对应的二维码到文件,宽和高都是300像素
BufferedImage bufferedImage = QrCodeUtil.generate(
content,
config);
// 插入图片
return bufferedImage;
}
我为了公用都会单独拿出来定义一个设置方法
/**
* 二维码基础设置
* @param width 宽 300
* @param height 长 300
* @return
*/
public static QrConfig getConfig(int width, int height){
//300,300
QrConfig config = new QrConfig(width, height);
// 设置边距,既二维码和背景之间的边距
config.setMargin(2);
// 设置前景色,既二维码颜色(青色)
config.setForeColor(Color.BLACK);
// 设置背景色(灰色)
config.setBackColor(Color.WHITE);
/**高纠错级别 :像素块小,允许遮挡一定范围,但是像素块更密集*/
config.setErrorCorrection(ErrorCorrectionLevel.H);
return config;
}
一,该方式为文件格式,主要用于自测和获取本地文件(不适用pass平台和服务器)
/**
* 两个图片合并(加文字) 文件格式
* @param sourceUrl 底部背景图
* @param config 二维码基础配置
* @param qrContent 二维码内容
* @param qrX 二维码横坐标
* @param qrY 二维码纵坐标
* @param textContent 文字(一般为标题)
* @param textFontSize 文字大小
* @param textFontX 文字的横坐标
* @param textFontY 文字的纵坐标
* @return
*/
@Override
public ByteArrayInputStream getQrCodeUrl(String sourceUrl,
QrConfig config,
String qrContent,
int qrX,
int qrY,
String textContent,
int textFontSize,
int textFontX,
int textFontY) {
//二维码设置
// QrConfig config = QrCodeUtils.getConfig();
//1,生成二维码
BufferedImage qrImage = QrCodeUtil.generate(qrContent, config);
// 2,将图片合成在一起
Image image = ImgUtil.pressImage(
//底图
ImgUtil.read(sourceUrl),
//二维码图(水印图)
qrImage,
// ImgUtil.read(codeFile),
qrX,
//y坐标修正值。 默认在中间,偏移量相对于中间偏移
qrY,
//透明度
1.0f
);
//3,加文字
Image pressTextImage = ImgUtil.pressText(
image,
//title
textContent,
//颜色
Color.WHITE,
//字体 42
new Font("黑体", Font.BOLD, textFontSize),
//x坐标修正值。 默认在中间,偏移量相对于中间偏移
textFontX,
//y坐标修正值。 默认在中间,偏移量相对于中间偏移
textFontY,
//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
1.0f
);
//转为流
ByteArrayInputStream inputStream = ImgUtil.toStream(pressTextImage, QrCodeUtils.FORMAT_NAME);
return inputStream;
}
二,输入输出流格式(重点,常用)
1,将网图或者本地的图片转为输入流。
2,然后再创建临时的输出流文件,将生成的图片放到流中,因为在pass平台,或者服务器上读不到file的文件的,要转成流格式。
3,输出生成的图片流,用流的方式进行上传阿里云华为云都行。
/**
* 网络底图转为流,返回流格式,两个图片合并(加文字)
* @param sourceUrl 底部背景图
* @param config 二维码基础配置
* @param qrContent 二维码内容
* @param qrX 二维码横坐标
* @param qrY 二维码纵坐标
* @param textContent 文字(一般为标题)
* @param textFontSize 文字大小
* @param textFontX 文字的横坐标
* @param textFontY 文字的纵坐标
* @return
*/
@Override
public ByteArrayInputStream getQrCodeUrl(String sourceUrl,
QrConfig config,
String qrContent,
int qrX,
int qrY,
String textContent,
int textFontSize,
int textFontX,
int textFontY) {
//二维码设置
// QrConfig config = QrCodeUtils.getConfig();
//1,生成二维码
BufferedImage qrImage = QrCodeUtil.generate(qrContent, config);
//将网络图转换成流
BufferedImage image = QrCodeUtils.stringTobufferedImage(sourceUrl);
InputStream inputStream = ImgUtil.toStream(image, QrCodeEnum.CodeEnum.PNG.getDesc());
//定义临时输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 2,将图片合成在一起
ImgUtil.pressImage(
inputStream,
outputStream,
qrImage,
qrX,
//y坐标修正值。 默认在中间,偏移量相对于中间偏移
qrY,
//透明度
QrCodeUtils.ALPHA
);
//3,加文字
ByteArrayInputStream input = new ByteArrayInputStream(outputStream.toByteArray());
ByteArrayOutputStream resultOut = new ByteArrayOutputStream();
ImgUtil.pressText(
input,
resultOut,
//title
textContent,
//颜色
Color.WHITE,
//字体 42
new Font(QrCodeEnum.CodeEnum.FONT_NAME.name(), Font.BOLD, textFontSize),
//x坐标修正值。 默认在中间,偏移量相对于中间偏移
textFontX,
//y坐标修正值。 默认在中间,偏移量相对于中间偏移
textFontY,
//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
QrCodeUtils.ALPHA
);
ByteArrayInputStream result = new ByteArrayInputStream(resultOut.toByteArray());
return result;
}
使用到的自定义封装的工具类,图片输入输出流转换工具类:Java之~hutool二维码工具类自定义QrCodeUtils,图片输入输出流转换_萍宝儿的博客-CSDN博客