今天在写项目的时候有几百条资源的下载需要生成二维码,就在网上找了一些材料,发现都是直接生成图片。
成千上万的数据生成图片,对于图片的存储实在是麻烦,之前做过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">