直接输出到浏览器 不生成文件 可设置logo和文字
1.引入pom.xml
<!-- 二维码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>${zxing.core.version}</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>${zxing.core.version}</version>
</dependency>
2.添加公共util.java
//生成二维码 设置logo
public static BufferedImage generateQrCode(String content, String logoPath) {
BufferedImage image = QrCodeUtil.generate(
content, // 二维码内容
QrConfig.create().setImg(logoPath) // 附带logo
.setWidth(500) // 二维码的宽
.setHeight(500) // 二维码的高
.setMargin(0)); // 边距
return image;
}
//从图片文件或BufferedImage中得到InputStream
public static InputStream getImageStream(BufferedImage bi) {
InputStream is = null;
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut;
try {
imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(bi, "png", imOut);
is = new ByteArrayInputStream(bs.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
//创建新图片
public static BufferedImage createPictureNew(BufferedImage image, String bgPath, String text) {
try {
// 首先先画背景图片
BufferedImage backgroundImage = ImageIO.read(new File(bgPath));
// 背景图片的宽度
int bgWidth = backgroundImage.getWidth();
// 二维码的宽度
int qrWidth = image.getWidth();
// 二维码距离背景图片横坐标(X)的距离,居中显示
int distanceX = (bgWidth - qrWidth) / 2;
// 二维码距离背景图片纵坐标(Y)的距离
int distanceY = distanceX;
// 基于图片backgroundImage对象打开绘图
Graphics2D rng = backgroundImage.createGraphics();
rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
rng.drawImage(image, distanceX, distanceY, null);
//设置字体
Font font = new Font("宋体", Font.PLAIN, 30);
rng.setFont(font);
rng.setColor(Color.black);
// 获取当前文字的对象
FontMetrics metrics = rng.getFontMetrics(font);
// 文字在图片中的坐标 这里设置在中间
int startX = (bgWidth - metrics.stringWidth(text)) / 2; //当前文字对象到横坐标(X)的距离
int startY = backgroundImage.getHeight()-10; //当前文字对象到纵坐标(Y)的距离
rng.drawString(text, startX, startY);
// 处理绘图
rng.dispose();
image = backgroundImage;
image.flush();
} catch (IOException e) {
e.printStackTrace();
}
// 将绘制好的图片返回
return image;
}
3.添加调用方法
try {
//设置输出文件格式
response.setContentType("image/png");
// 存放在二维码中的内容
String text = stuNo;
//获取二维码logo路径
String logoPath = imgUrl + "logo.png";
//二维码背景图路径 图片最好比较大一点
String bgPath = imgUrl + "logo_bg.png";
//生成二维码
BufferedImage qrCodeImage = QRcodeUtils.generateQrCode(text, logoPath);
BufferedImage picture = QRcodeUtils.createPictureNew(qrCodeImage, bgPath, "设置文字");
//获取绘制好的图片的InputStream对象
InputStream in = QRcodeUtils.getImageStream(picture);
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
//创建存放文件内容的数组
byte[] buff =new byte[1024];
//所读取的内容使用n来接收
int n;
//当没有读取完时,继续读取,循环
while((n=in.read(buff))!=-1){
//将字节数组的数据全部写入到输出流中
outputStream.write(buff,0,n);
}
//强制将缓存区的数据进行输出
outputStream.flush();
//关流
outputStream.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
- 部署到linux服务器 Graphics2D 中文乱码 乱码问题 请参考 https://blog.csdn.net/sinat_34797000/article/details/101107322