java 生成二维码 实践 图片流形式

本文介绍了一种使用Java生成二维码的方法,并通过流的方式直接在Web页面中展示,避免了大量图片的存储问题。适用于需要生成大量二维码的应用场景。

今天在写项目的时候有几百条资源的下载需要生成二维码,就在网上找了一些材料,发现都是直接生成图片。

成千上万的数据生成图片,对于图片的存储实在是麻烦,之前做过php的二维码 ,就是以流的形式在页面显示

所以用java我也想这么干

网上找到的生成二维码的jar包 不变 qrcodeswetake.jar

我的是maven项目,那个生成二维码的jar不在仓库,哎,自己放在了lib包下,maven中配置

<!--二维码jar -->
<dependency>
<groupId>swetake</groupId>
<artifactId>swetake</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/qrcodeswetake.jar</systemPath>
</dependency>
<!--二维码jar -->


import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import com.swetake.util.Qrcode;

public class QRCodeUtil {

private static int LEVEL = 7;

private static int WIDTH = 140;

private static int HEIGHT = 140;

private static String PATH = "/";

private static int PIXOFF = 2;

//
public QRCodeUtil(String path){

QRCodeUtil.PATH = path;

}

/**
* 生成二维码
* */
public static BufferedImage encodeQRCode(String content){
BufferedImage bufImg = null;
try {
Qrcode qrcodeHandle = new Qrcode();
qrcodeHandle.setQrcodeErrorCorrect('M');
qrcodeHandle.setQrcodeEncodeMode('B');
qrcodeHandle.setQrcodeVersion(QRCodeUtil.LEVEL);
byte[] contentBytes = content.getBytes("UTF-8");
bufImg = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bufImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, WIDTH, HEIGHT);
gs.setColor(Color.BLACK);
int pixoff = QRCodeUtil.PIXOFF;
if(contentBytes.length>0&&contentBytes.length<120){
boolean[][] codeOut = qrcodeHandle.calQrcode(contentBytes);
for (int i = 0; i < codeOut.length; i++) {
for (int j = 0; j < codeOut.length; j++) {
if(codeOut[j][i]){
gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
}
}
}
}else{
System.err.println("生成二维码的内容小于2个字符或者大于120个字符");
}
gs.dispose();
bufImg.flush();
// File file = new File("new.png");
// ImageIO.write(bufImg, "png", file);
} catch (Exception e) {
e.printStackTrace();
}
return bufImg;
}
}

 

以上工具类代码

controller中这么写

/**
* 生成二维码
* */
@RequestMapping(value = "qrcode")
public void qrcode(HttpServletRequest httpServletRequest,HttpServletResponse response,String url){
BufferedImage bi = QRCodeUtil.encodeQRCode(url);
//设置响应头通知浏览器以图片的形式打开
response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
//设置响应头控制浏览器不要缓存
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//将图片写给浏览器
try {
ImageIO.write(bi, "jpg", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

 

jsp中这么写

 

 <img alt="" src="${ctx }/qrcode?url=http://www.baidu.com">

 

转载于:https://www.cnblogs.com/ssdu/p/4748207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值